Loading
Loading
Cette fiche traite trois idées liées du programme de terminale NSI : écrire et tracer des fonctions récursives (cas de base, cas récursif, pile d'appels), justifier leur terminaison, puis les notions de calculabilité et de décidabilité. Le point d'orgue est le problème de l'arrêt, exemple historique (Turing, 1936) d'un problème indécidable : aucun algorithme ne peut décider de l'arrêt de tout programme. La récursivité terminale n'est pas au programme : on s'en tient au schéma cas de base / cas récursif et à la pile d'appels.
5sectionsca. 20min de lecture4compétencesNiveauBase 1 · Standard 2 · Approfondissement 2Vérifié · 06/2026
Lesetiefe: Approfondi
Schriftgröße: Standard
Définition récursive de la factorielle : descente vers le cas de base
Définition récursive de la factorielle
Le cas de base 0! = 1 arrête la descente ; le cas récursif ramène le calcul de n! à celui de (n−1)!, plus proche du cas de base.
Somme 0+1+...+n par récurrence
Même schéma : initialisation à 0, puis on ajoute n à la somme jusqu'à n−1.
Écrire une fonction récursive somme(n) qui renvoie 0+1+2+...+n pour un entier n ⩾ 0. Préciser le cas de base et le cas récursif, puis calculer somme(4) en déroulant les appels.
Pour n = 0, la somme vaut 0 : on renvoie 0 directement, sans appel récursif.
Pour n ⩾ 1, la somme de 0 à n vaut n plus la somme de 0 à n−1. En Python : def somme(n): return 0 if n == 0 else n + somme(n-1).
On descend : somme(4) = 4 + somme(3) = 4 + 3 + somme(2) = 4 + 3 + 2 + somme(1) = 4 + 3 + 2 + 1 + somme(0).
somme(0) = 0 arrête la descente ; on remonte en additionnant : 0 → 1 → 3 → 6 → 10.
Résultat : somme(4) = 10. Le cas de base est somme(0) = 0 ; le cas récursif est somme(n) = n + somme(n−1).
Erreurs fréquentes
Révision active
Écrire une fonction récursive somme(n) qui renvoie 0+1+2+...+n pour un entier n ⩾ 0. Préciser le cas de base et le cas récursif, puis vérifier le résultat à la main pour n = 4.
Rappel actif
Rappelle-toi les points clés — puis révèle.
Sources : Programme de spécialité NSI — classe terminale (voie générale), BO spécial n° 8 du 25 juillet 2019 (Ministère de l'Éducation nationale) · Programmes et ressources en numérique et sciences informatiques — voie générale (Éduscol)
Arbre des appels de fib(5) : 15 appels, recouvrements et coût exponentiel
Profondeur de la pile (factorielle)
Les cadres fact(n), fact(n−1), ..., fact(0) sont empilés simultanément au moment où le cas de base est atteint : il y en a n+1.
Nombre total d'appels de fib naïf
A(n) compte les appels : un pour l'appel courant, plus ceux des deux sous-appels. On vérifie A(5) = 15 ; ce nombre croît exponentiellement.
Croissance du nombre d'appels : fib naïf (exponentiel) contre approche linéaire
On exécute fact(4) avec fact(0)=1 et fact(n)=n*fact(n-1). Décrire l'évolution de la pile d'appels (descente puis remontée) et donner la profondeur maximale atteinte ainsi que le résultat.
On empile successivement, dans cet ordre : fact(4), fact(3), fact(2), fact(1), fact(0). Chacun attend la valeur de l'appel qu'il a déclenché.
fact(0) renvoie 1 sans nouvel appel : la descente s'arrête. La pile contient alors 5 cadres simultanément.
On combine de bas en haut : fact(1) = 1×1 = 1, fact(2) = 2×1 = 2, fact(3) = 3×2 = 6, fact(4) = 4×6 = 24. Chaque dépilement libère un cadre.
La pile est vide une fois fact(4) renvoyé. Le nombre d'appels (5) est ici égal à la profondeur car la récursion est linéaire (un seul appel par cadre).
Résultat : fact(4) = 24 ; profondeur maximale de la pile = 5 cadres (fact(4) à fact(0)).
Une fonction récursive ne s'exécute pas par magie : chaque appel non terminé est rangé dans la pile d'appels. Suivons fact(4).
À la descente, on empile fact(4), puis fact(3), fact(2), fact(1) et enfin fact(0). Chaque cadre attend le résultat de l'appel suivant.
fact(0) vaut 1 : c'est le cas de base. Il arrête la descente et déclenche le dépilement.
On remonte en multipliant : 1, puis 1, 2, 6 et 24. La pile se vide du sommet vers la base.
Retenez la distinction : la profondeur de la pile vaut n+1, mais le nombre TOTAL d'appels peut exploser, comme pour fib où il croît exponentiellement.
Erreurs fréquentes
Révision active
Pour la fonction fib définie par fib(0)=0, fib(1)=1, fib(n)=fib(n-1)+fib(n-2), dessiner l'arbre des appels de fib(4) et compter le nombre total d'appels. Comparer ce nombre à la profondeur maximale de la pile.
Rappel actif
Rappelle-toi les points clés — puis révèle.
Sources : Programme de spécialité NSI — classe terminale (voie générale), BO spécial n° 8 du 25 juillet 2019 (Ministère de l'Éducation nationale) · Programmes et ressources en numérique et sciences informatiques — voie générale (Éduscol)
Terminaison : un variant entier décroît strictement vers le cas de base
Principe du variant
Une suite d'entiers positifs strictement décroissante ne peut pas être infinie ; elle atteint donc nécessairement le cas de base.
Variant de la factorielle
Le variant n décroît de 1 à chaque appel et reste positif ; il atteint 0 en n appels, ce qui prouve la terminaison.
On considère pgcd(a, b) : si b = 0, renvoyer a ; sinon, renvoyer pgcd(b, a mod b), avec a et b entiers naturels. Justifier que cette fonction récursive termine.
On prend pour variant le second argument b, qui est un entier naturel (⩾ 0) à chaque appel.
À l'appel récursif pgcd(b, a mod b), le nouveau second argument est a mod b. Or, par définition du reste, on a toujours 0 ⩽ a mod b < b lorsque b > 0. Le variant passe donc de b à une valeur STRICTEMENT plus petite.
Le variant b est un entier positif qui décroît strictement à chaque appel récursif ; une telle suite est finie et atteint nécessairement 0.
Quand le variant atteint 0, le test b = 0 est vrai : on renvoie a sans nouvel appel. La fonction s'arrête donc après un nombre fini d'appels.
Résultat : Le variant b décroît strictement (0 ⩽ a mod b < b) et reste minoré par 0 ; il atteint 0 en un nombre fini d'appels, donc pgcd termine.
Erreurs fréquentes
Révision active
On considère pgcd(a, b) défini par : si b = 0 renvoyer a, sinon renvoyer pgcd(b, a mod b). Justifier que cette fonction récursive termine en exhibant un variant entier positif strictement décroissant.
Rappel actif
Rappelle-toi les points clés — puis révèle.
Sources : Programme de spécialité NSI — classe terminale (voie générale), BO spécial n° 8 du 25 juillet 2019 (Ministère de l'Éducation nationale) · Programmes et ressources en numérique et sciences informatiques — voie générale (Éduscol)
Un programme est une donnée : A reçoit P et d en arguments
Définition d'une fonction calculable
Une fonction est calculable s'il existe un algorithme qui, pour toute entrée x, s'arrête et renvoie f(x). Certaines fonctions n'ont aucun tel algorithme.
Citer trois logiciels qui prennent du code en entrée, expliquer ce qu'ils en font, et expliquer pourquoi cette idée est essentielle pour la calculabilité.
On lui passe un fichier .py (du texte) ; il le lit comme une donnée, l'analyse, puis l'exécute. Le programme P est ici la DONNÉE d'entrée de l'interpréteur.
Il reçoit un code source (texte), le vérifie et le traduit en code machine. Là encore, le programme à compiler est traité comme une donnée à transformer.
Il lit le code d'un exécutable pour décider s'il est malveillant : il RAISONNE sur un programme à partir de son texte, sans forcément l'exécuter.
Puisqu'un programme est un texte manipulable, on peut construire un programme A qui prend un programme P (et même P lui-même) en argument. C'est précisément ce mécanisme d'auto-référence qui permet de prouver que certains problèmes, comme l'arrêt, sont indécidables.
Résultat : Un programme est une donnée car c'est un texte que d'autres programmes (interpréteur, compilateur, antivirus) lisent et traitent. Cette propriété autorise l'auto-référence, fondement des résultats d'indécidabilité.
Erreurs fréquentes
Révision active
Citer trois logiciels du quotidien qui prennent un programme (du code) en entrée et expliquer en une phrase, pour chacun, ce qu'ils en font. En déduire ce qu'on entend par « un programme est une donnée ».
Rappel actif
Rappelle-toi les points clés — puis révèle.
Sources : Programme de spécialité NSI — classe terminale (voie générale), BO spécial n° 8 du 25 juillet 2019 (Ministère de l'Éducation nationale) · Programmes et ressources en numérique et sciences informatiques — voie générale (Éduscol)
Indécidabilité du problème de l'arrêt : la preuve par l'absurde
L'hypothétique décideur universel d'arrêt
On SUPPOSE qu'un tel STOP existe et s'arrête toujours en donnant la bonne réponse. La preuve aboutit à une contradiction, donc STOP ne peut exister.
Le programme auto-contradictoire
Appliqué à lui-même, PARADOXE(PARADOXE) s'arrête si et seulement s'il ne s'arrête pas : c'est la contradiction qui réfute l'existence de STOP.
Énoncer le problème de l'arrêt, puis démontrer par l'absurde qu'il est indécidable.
Le problème de l'arrêt demande : existe-t-il un algorithme qui, recevant n'importe quel programme P et n'importe quelle entrée d, répond toujours correctement à la question « l'exécution de P sur d s'arrête-t-elle ? »
Supposons qu'un tel décideur STOP(P, d) existe, qu'il s'arrête toujours et renvoie « vrai » si P(d) s'arrête, « faux » sinon.
Comme un programme est une donnée, on peut écrire PARADOXE(P) qui appelle STOP(P, P) : si la réponse est « vrai » (P(P) s'arrête), PARADOXE boucle à l'infini ; si elle est « faux », PARADOXE s'arrête aussitôt.
Exécutons PARADOXE(PARADOXE). Premier cas : il s'arrête. Alors STOP(PARADOXE, PARADOXE) avait répondu « vrai », donc par construction PARADOXE devait BOUCLER — contradiction. Deuxième cas : il boucle. Alors STOP avait répondu « faux », donc PARADOXE devait S'ARRÊTER — contradiction encore.
Les deux cas mènent à une contradiction. L'hypothèse de départ est donc fausse : aucun programme STOP universel n'existe. Le problème de l'arrêt est indécidable.
Résultat : Aucun algorithme ne peut décider l'arrêt de tout couple (programme, entrée) : le problème de l'arrêt est INDÉCIDABLE (Turing, 1936). C'est l'exemple canonique d'un problème indécidable.
Erreurs fréquentes
Révision active
Énoncer le problème de l'arrêt, puis rédiger la preuve de son indécidabilité par l'absurde : poser l'hypothèse d'un programme STOP, construire un programme auto-contradictoire, et dégager la contradiction.
Rappel actif
Rappelle-toi les points clés — puis révèle.
Sources : Programme de spécialité NSI — classe terminale (voie générale), BO spécial n° 8 du 25 juillet 2019 (Ministère de l'Éducation nationale) · Programmes et ressources en numérique et sciences informatiques — voie générale (Éduscol)
Références et sources