Comment être sûr qu'un programme récursif donne toujours le bon résultat ?
Une fonction récursive se prouve comme une propriété mathématique : par récurrence. Pour fact(n) = n × fact(n − 1) avec fact(0) = 1, l'initialisation est le cas de base et l'hérédité suit l'appel récursif. Tester des valeurs ne suffit pas, la récurrence couvre tous les entiers.
Grand oral session 2027 : exposé de 10 minutes debout, puis 10 minutes d'échange, sans calculatrice. Plan prévu pour 9,5 min.
Pourquoi cette question : un modèle d'introduction
Le jury attend que vous expliquiez pourquoi vous avez choisi la question. Inspirez-vous de ce modèle, mais racontez votre propre parcours.
En NSI, j'ai écrit une fonction récursive qui calculait la factorielle. Elle marchait sur tous mes tests, mais mon professeur m'a demandé : « Comment sais-tu qu'elle marche pour n = 1 000 000 ? » Je ne pouvais pas tout tester. En terminale, j'ai découvert le raisonnement par récurrence, et j'ai compris qu'il a exactement la même structure qu'une fonction récursive.
L'enjeu et les notions du programme
Montrer que le raisonnement par récurrence et la programmation récursive sont deux faces d'une même idée, et s'en servir pour prouver la correction et la terminaison d'un programme.
Mathématiques
- Raisonnement par récurrence (terminale)
- Suites définies par récurrence (première)
- Factorielle (terminale)
Numérique et sciences informatiques
- Récursivité : cas de base, appel récursif (terminale)
- Correction et terminaison d'un programme (première, terminale)
Le plan de l'exposé en 9,5 min
1. Introduction
1 minUne fonction récursive s'appelle elle-même sur un problème plus petit. Problématique : comment démontrer qu'elle calcule ce qu'on attend, pour toutes les entrées, sans pouvoir les tester toutes ?
2. Mathématiques : la récurrence
3,5 minOn veut montrer une propriété P(n) pour tout entier n≥0. Initialisation : P(0) est vraie. Hérédité : si P(n-1) est vraie, alors P(n) l'est aussi. On conclut que P(n) est vraie pour tout n, comme une chaîne de dominos.
La factorielle se définit elle-même par récurrence : 0!=1 et n!=n×(n-1)!. On peut aussi démontrer par récurrence des propriétés comme n!≥2ⁿ⁻¹ pour n≥1 : vrai pour n=1 ; si (n-1)!≥2ⁿ⁻², alors n!=n(n-1)!≥2×2ⁿ⁻²=2ⁿ⁻¹ car n≥2.
3. NSI : prouver la fonction
3,5 minLa fonction : si n=0, renvoyer 1 ; sinon renvoyer n× fact (n-1). On note P(n) : « fact(n) renvoie n! ».
Initialisation : fact(0) renvoie 1, qui vaut 0!. Hérédité : supposons que fact(n-1) renvoie (n-1)!. Alors fact(n) renvoie n×(n-1)!=n!. La fonction est correcte pour tout n≥0.
Terminaison : chaque appel diminue n de 1, et un entier positif ne peut diminuer indéfiniment ; on atteint 0, le cas de base. Si l'on appelait fact(-1), on descendrait sans fin : la preuve suppose n≥0, d'où l'intérêt d'une assertion qui vérifie l'entrée. Un oubli du cas de base correspond à une récurrence sans initialisation : rien n'est démontré.
4. Conclusion
1,5 minUn programme récursif se prouve par récurrence : le cas de base est l'initialisation, l'appel récursif est l'hérédité. Cette preuve couvre toutes les entrées, là où les tests n'en couvrent que quelques-unes. J'ouvre sur les langages de preuve, comme Coq, qui vérifient ces démonstrations automatiquement.
Ce que j'écris au tableau
Pas de calculatrice ni de support numérique : un calcul clé écrit au tableau rend l'exposé concret et montre la solidité des connaissances.
P(n): fact (n)=n! P(0) vrai P(n-1)⇒ fact (n)=n×(n-1)!=n!
Conclusion : la réponse à la question
Prouver un programme récursif, c'est faire une récurrence. Les deux outils ont été conçus l'un pour l'autre : chaque cas de base et chaque appel ont leur rôle dans la démonstration.
Les questions probables du jury
Pendant les 10 minutesd'échange, le jury vous fait préciser et approfondir, sur tout le programme de vos spécialités en lien avec la question.
Que se passe-t-il si l'on oublie le cas de base ?
La fonction s'appelle indéfiniment jusqu'à dépasser la profondeur maximale ; en maths, c'est une récurrence sans initialisation.
Démontrez que fact(n) termine.
n est un entier positif qui décroît strictement à chaque appel : il atteint 0 en n appels.
Combien d'appels pour fact(10) ?
11 appels : de fact(10) à fact(0).
Peut-on écrire la factorielle sans récursivité ?
Oui, avec une boucle qui multiplie un accumulateur par 1, 2, …, n ; on la prouve avec un invariant de boucle.
Qu'est-ce qu'un invariant de boucle ?
Une propriété vraie avant la boucle et conservée à chaque tour ; c'est l'équivalent itératif de l'hérédité.
Les pièges qui coûtent des points
- Confondre test et preuve.
- Oublier de démontrer la terminaison.
- Écrire une hérédité qui suppose ce qu'on veut démontrer.
Revoir les notions
Autres questions : récursivité et récurrence
- Pourquoi un programme récursif de quatre lignes met-il des secondes à calculer le 30ᵉ terme de Fibonacci ?
- Pourquoi un programme récursif peut-il « déborder » alors que le même calcul en boucle fonctionne ?
- Comment une figure dessinée par un programme récursif peut-elle avoir une aire nulle et une infinité de triangles ?
- De combien de façons peut-on monter un escalier en faisant des pas d'une ou deux marches ?
Préparer l'oral, pas seulement le contenu
Gestion des 20 minutes de préparation, usage du tableau, posture debout, réponses au jury : la méthode complète, conforme aux règles de la session 2027.
Méthode : traiter une question de Grand oral →