Comment démontrer qu'une fonction récursive très étrange renvoie toujours 91 ?
M(n) = n − 10 si n > 100, et M(n) = M(M(n + 11)) sinon. On démontre par récurrence descendante que M(n) = 91 pour tout n ≤ 100, d'abord pour 90 ≤ n ≤ 100, puis par blocs de 11. Un programme qui semble chaotique cache un comportement très simple.
Grand oral session 2027 : exposé de 10 minutes debout, puis 10 minutes d'échange, sans calculatrice. Plan prévu pour 10 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.
Mon professeur de NSI nous a montré une fonction récursive qui s'appelle deux fois imbriquée sur elle-même, et nous a demandé de deviner ce qu'elle renvoie. En la testant, j'ai obtenu 91 pour tous les nombres que j'essayais. J'ai voulu savoir si c'était toujours vrai, et surtout le démontrer, car aucun test ne pouvait couvrir tous les entiers.
L'enjeu et les notions du programme
Démontrer par récurrence un résultat sur une fonction récursive non triviale, en choisissant soigneusement l'ordre de la récurrence.
Mathématiques
- Raisonnement par récurrence, récurrence descendante (terminale)
- Raisonnement par disjonction de cas (seconde)
- Fonctions définies par morceaux (seconde)
Numérique et sciences informatiques
- Récursivité, appels imbriqués (terminale)
- Terminaison et correction d'un programme (terminale)
Le plan de l'exposé en 10 min
1. Introduction
1 minJohn McCarthy, un pionnier de l'intelligence artificielle, a proposé en 1970 la fonction : M(n)=n-10 si n>100, et M(n)=M(M(n+11)) sinon. Problématique : que renvoie-t-elle, et comment le démontrer pour tous les entiers ?
2. Mathématiques : une récurrence en descendant
4,5 minPour n>100, M(n)=n-10 : par exemple M(101)=91. Montrons que M(n)=91 pour tout entier n≤100.
Premier bloc, 90≤ n≤100. Alors n+11≥101, donc M(n+11)=n+1 et M(n)=M(n+1). Ainsi M(90)=M(91)=…=M(100)=M(101)=91.
Hérédité par blocs : supposons M(k)=91 pour tout k entre n+1 et 100, avec n<90. Alors n+11 est entre n+1 et 100 (car n+11≤100), donc M(n+11)=91 et M(n)=M(91)=91. On descend ainsi de 89 à -∞ : M(n)=91 pour tout n≤100.
Le résultat est donc : M(n)=91 si n≤100, et M(n)=n-10 sinon. La définition récursive tortueuse cache une fonction définie par morceaux très simple.
3. NSI : terminaison et coût
3 minLa terminaison n'est pas évidente : l'argument augmente de 11 puis diminue de 10. La preuve par récurrence montre au passage que chaque appel termine. On peut compter les appels en Python : pour n=0, la fonction fait 203 appels avant de renvoyer 91.
Cet exemple sert en informatique à tester les outils de vérification automatique de programmes : un vérificateur doit trouver seul l'invariant « le résultat vaut 91 ». Il montre aussi que les tests suggèrent un résultat, mais que seule la démonstration le garantit.
4. Conclusion
1,5 minLa fonction 91 renvoie toujours 91 pour n≤100 : une récurrence descendante, menée par blocs, le démontre. Choisir le bon sens de la récurrence est la clé. J'ouvre sur la fonction de Syracuse, dont on ne sait toujours pas démontrer qu'elle termine.
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.
90≤ n≤100: M(n)=M(n+1)=…=M(101)=91 n<90: M(n)=M(91)=91
Conclusion : la réponse à la question
Une fonction récursive à l'allure chaotique peut se démontrer simple. La récurrence, menée dans le bon ordre, transforme des tests convaincants en certitude.
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.
Calculez M(99) à la main.
M(99)=M(M(110))=M(100)=M(M(111))=M(101)=91.
Pourquoi raisonner de 100 vers le bas ?
Le calcul de M(n) fait appel à des valeurs plus grandes que n : il faut les connaître d'abord.
Que vaut M(150) ?
140, car 150 > 100.
Pourquoi cette fonction termine-t-elle ?
Par la récurrence elle-même : on montre bloc par bloc que les appels aboutissent à une valeur.
Les tests suffisaient-ils à conclure ?
Non : on ne peut tester qu'un nombre fini d'entiers, alors que la propriété porte sur une infinité.
Combien d'appels pour calculer M(99) ?
Cinq appels : M(99), M(110), M(100), M(111) et M(101). Plus on part bas, plus il y en a : 203 pour M(0).
Les pièges qui coûtent des points
- Faire une récurrence montante qui utilise des valeurs non encore connues.
- Oublier le premier bloc 90 à 100.
- Confondre tester et démontrer.
Revoir les notions
Autres questions : récursivité et récurrence
- Comment être sûr qu'un programme récursif donne toujours le bon résultat ?
- 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 ?
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 →