24-NSIJ2ME3-1

  1. La variable i prend successivement les valeurs : 7, 8, 9 et enfin 10. f1(7) se termine donc.

  2. f1(-2) se termine et renvoie 10.

  3. Les 5 premières valeurs prises par i sont 12, 13, 14, 15 et 16. La fonction ne se termine pas car i n'atteindra jamais 10.

  4. L'appel f(n) se termine si et seulement si n est un entier inférieur ou égal à 10.

  5. f2(4) se termine et renvoie 4 + 2 + 0 = 6.

  6. f2(5) ne se termine pas car le cas de base n'est jamais atteint. En effet, chaque appel diminue la valeur de 2 : f2(5) appelle f2(3) qui appelle f2(1), f2(-1), f2(-3), etc. sans jamais atteindre une condition d'arrêt, ce qui entraîne une récursion infinie.

  7. L'appel f2(n) se termine si et seulement si n est un entier positif ou nul pair.

  8. def infini(n):
        infini(0)
    
  9. Si arret(code_paradoxe, code_paradoxe) renvoie True alors la prochaine instruction à être exécutée est infini(42), ainsi l'appel paradoxe(code_paradoxe) ne se termine pas.

  10. Sinon, si arret(code_paradoxe, code_paradoxe) renvoie False alors la prochaine instruction à être exécutée est return 0, ainsi l'appel paradoxe(code_paradoxe) termine.

  11. On a supposé que la fonction arret existait, mais cette hypothèse conduit à une situation paradoxale décrite par les deux questions précédentes. En effet, lorsque arret affirme que paradoxe s'arrête, ce dernier ne s'arrête pas, et lorsque arret affirme que paradoxe ne s'arrête pas, il s'arrête. On aboutit donc à une contradiction. Par conséquent, notre hypothèse de départ est fausse : la fonction arret ne peut pas exister. Il s'agit d'un raisonnement par l'absurde.