MathLvl
Question transversaleMathsNSIRécursivité et récurrence

Pourquoi un programme récursif de quatre lignes met-il des secondes à calculer le 30ᵉ terme de Fibonacci ?

La fonction fib(n) = fib(n − 1) + fib(n − 2) fait A(n) = 2F(n + 1) − 1 appels : 177 pour n = 10, 2 692 537 pour n = 30. Le nombre d'appels croît comme 1,618ⁿ. En mémorisant les résultats, on passe à n appels seulement.

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.

J'ai programmé la suite de Fibonacci en récursif, comme sa définition. Pour n = 10, le résultat est immédiat ; pour n = 35, j'ai attendu de longues secondes. J'ai voulu comprendre pourquoi une définition si simple donne un programme si lent, et j'ai découvert que le nombre d'appels suit lui-même une suite de Fibonacci.

L'enjeu et les notions du programme

Établir une relation de récurrence sur le nombre d'appels, la résoudre par récurrence et comparer avec la version mémoïsée.

Mathématiques

  • Suites définies par récurrence, suite de Fibonacci (première)
  • Raisonnement par récurrence (terminale)
  • Croissance géométrique, nombre d'or (première)

Numérique et sciences informatiques

  • Récursivité, arbre des appels (terminale)
  • Programmation dynamique, mémoïsation (terminale)

Le plan de l'exposé en 9,5 min

  1. 1. Introduction

    1 min

    La suite de Fibonacci vérifie F₀=0, F₁=1, Fₙ=Fₙ₋₁+Fₙ₋₂. Programmée telle quelle, la fonction s'appelle deux fois à chaque étape. Problématique : combien d'appels fait-elle, et comment l'accélérer ?

  2. 2. Mathématiques : compter les appels

    4 min

    Notons A(n) le nombre d'appels pour calculer fib(n). On a A(0)=A(1)=1, et pour n≥2 : A(n)=1+A(n-1)+A(n-2) (l'appel lui-même, plus ceux des deux sous-calculs).

    On conjecture A(n)=2Fₙ₊₁-1 et on le démontre par récurrence forte. Initialisation : A(0)=2F₁-1=1 et A(1)=2F₂-1=1. Hérédité : A(n)=1+(2Fₙ-1)+(2Fₙ₋₁-1)=2(Fₙ+Fₙ₋₁)-1=2Fₙ₊₁-1.

    Valeurs : A(10)=2×89-1=177, A(30)=2×1 346 269-1=2 692 537. Comme Fₙ croît à peu près comme φⁿ avec φ≈1,618, chaque terme supplémentaire multiplie le temps par environ 1,6 : passer de 30 à 40 le multiplie par φ¹⁰≈123.

  3. 3. NSI : mémoriser pour ne pas recalculer

    3 min

    L'arbre des appels montre le gaspillage : fib(28) est calculé 2 fois, fib(27) 3 fois, fib(26) 5 fois… On recalcule sans cesse les mêmes valeurs.

    Mémoïsation : on stocke chaque résultat dans un dictionnaire ; avant de calculer, on regarde s'il est déjà connu. Chaque fib(k) n'est alors calculé qu'une fois : environ n calculs. Une boucle qui garde les deux derniers termes fait de même, avec une mémoire constante. En Python, le décorateur lru_cache réalise cette mémoïsation automatiquement. C'est le principe de la programmation dynamique.

  4. 4. Conclusion

    1,5 min

    La version récursive naïve fait 2Fₙ₊₁-1 appels, une croissance exponentielle ; en mémorisant, on n'en fait que n. La même définition mathématique peut donner un programme très lent ou très rapide. J'ouvre sur la formule de Binet, qui donne Fₙ directement à l'aide de φ.

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.

A(n)=1+A(n-1)+A(n-2), A(0)=A(1)=1
A(n)=2Fₙ₊₁-1 A(10)=177 A(30)=2 692 537 φ¹⁰≈123

Conclusion : la réponse à la question

Le nombre d'appels de Fibonacci récursif est lui-même un nombre de Fibonacci, multiplié par 2 : il croît exponentiellement. Mémoriser les résultats ramène le coût à n opérations.

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.

Combien de fois fib(2) est-il appelé pour calculer fib(6) ?

5 fois, soit F₅ : en général fib(k) est appelé Fₙ₋ₖ₊₁ fois pour 2≤ k≤ n.

Qu'est-ce qu'une récurrence forte ?

Une récurrence où l'hérédité suppose la propriété vraie pour tous les rangs précédents (ici les deux précédents).

Que vaut φ, et quel est son lien avec Fibonacci ?

φ=(1+sqrt5)/2 ; le rapport Fₙ₊₁/Fₙ tend vers φ.

Quel est le coût mémoire de la mémoïsation ?

On stocke n valeurs ; la version itérative n'en garde que deux.

Pourquoi « 1 + » dans la relation de A(n) ?

On compte l'appel courant en plus des appels faits par les deux sous-calculs.

Les pièges qui coûtent des points

  • Confondre la valeur F(n) et le nombre d'appels A(n).
  • Oublier l'initialisation double dans la récurrence.
  • Penser que la récursivité est lente par nature : c'est le recalcul qui coûte.

Revoir les notions

Autres questions : récursivité et récurrence

Toutes les questions maths-nsi →

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 →