Aller au contenu

Numérique et sciences informatiques (spécialité) · TerminaleBac

La récursivité en NSI : cours de Terminale

Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur

L'essentiel

  • Une fonction est récursive quand elle s'appelle elle-même ; elle se ramène à un problème plus petit du même type.3
  • Il faut toujours un cas de base (condition d'arrêt) sans appel récursif, sinon le programme ne se termine pas.1
  • Chaque appel récursif doit rapprocher des cas de base : c'est l'argument de terminaison.
  • Les structures comme les listes et les arbres se définissent et se traitent naturellement de façon récursive.3
  • Un programme récursif peut être plus lent que sa version itérative ; on choisit selon la clarté et le coût.1

Introduction : une fonction qui s'appelle elle-même

Jusqu'ici, pour répéter une opération, tu as utilisé des boucles for et while. Il existe une autre manière de répéter : écrire une fonction qui s'appelle elle-même. C'est la récursivité, un chapitre du thème « Langages et programmation » de la spécialité NSI, que tu abordes après la calculabilité et la décidabilité.

Côté vocabulaire, le terme dérive de l'anglais recursive, lui-même tiré du latin recurrere, « revenir en arrière ».4 L'idée dépasse largement l'informatique : une démarche est récursive quand elle se décrit en se référant à elle-même, ce qui revient à appliquer plusieurs fois la même règle.3

En informatique, une fonction (ou, plus généralement, un algorithme) qui s'appelle elle-même au cours de son exécution est dite récursive.3 On s'en sert surtout pour parcourir des structures de données récursives, et pour mettre en œuvre la méthode « diviser pour régner ».3

Dans ce cours, tu vas :

  • comprendre le fonctionnement d'un appel récursif, pas à pas ;
  • apprendre à concevoir une fonction récursive à partir d'un cas de base et d'un cas récursif ;
  • justifier qu'une fonction récursive se termine ;
  • visualiser la pile des appels et comprendre ses limites ;
  • écrire des fonctions récursives sur des nombres, des listes et des chaînes ;
  • comparer récursivité et itération, ce qui revient régulièrement à l'épreuve.

Pour la suite, le chapitre prépare les notions de modularité, de paradigmes de programmation et de mise au point des programmes.

Premier exemple : la factorielle

Prenons le calcul de la factorielle d'un entier n≥0n \geq 0, notée n!n!. On la définit par 0!=10! = 1 et, pour n≥1n \geq 1, n!=n×(n−1)!n! = n \times (n-1)!. Cette définition est déjà récursive : pour calculer n!n!, on a besoin de (n−1)!(n-1)!, qui est un problème du même genre, mais plus petit.

Déroulons factorielle(3). Chaque ligne décrit ce que la fonction attend :

  • factorielle(3) renvoie 3 * factorielle(2) : il faut d'abord connaître factorielle(2) ;
  • factorielle(2) renvoie 2 * factorielle(1) ;
  • factorielle(1) renvoie 1 * factorielle(0) ;
  • factorielle(0) renvoie 1 directement : plus aucun appel.

La « descente » s'arrête là. Commence alors la « remontée » : factorielle(1) vaut 1×1=11 \times 1 = 1, puis factorielle(2) vaut 2×1=22 \times 1 = 2, enfin factorielle(3) vaut 3×2=63 \times 2 = 6.

Retiens ce mouvement en deux temps : on descend en empilant des calculs en attente, puis on remonte en les terminant un à un.

Déroulement de factorielle(3)Quatre étapes : descente jusqu'au cas de base factorielle(0) puis remontée des multiplications jusqu'à 6.1Appel de 33 * factorielle(2) est mis en attente2Descentefactorielle(2), puis factorielle(1) attendent3Cas de basefactorielle(0) renvoie 1 sans autre appel4Remontée1, puis 2, puis 6 : le résultat final
  1. Appel de 33 * factorielle(2) est mis en attente
  2. Descentefactorielle(2), puis factorielle(1) attendent
  3. Cas de basefactorielle(0) renvoie 1 sans autre appel
  4. Remontée1, puis 2, puis 6 : le résultat final
Déroulement de factorielle(3) · On descend en empilant les calculs, puis on remonte en les terminant.

Anatomie d'une fonction récursive

Terminaison : pourquoi la fonction s'arrête

Écrire une fonction récursive ne suffit pas : il faut être sûr qu'elle se termine pour toute donnée autorisée. En NSI, on le justifie avec un variant, une grandeur entière positive ou nulle qui diminue strictement à chaque appel récursif.

Prenons factorielle(n) avec n≥0n \geq 0 entier. Le variant est nn lui-même :

  • nn est un entier positif ou nul ;
  • à chaque appel récursif, on passe de nn à n−1n - 1, donc la valeur diminue strictement ;
  • un entier positif ou nul ne peut pas diminuer strictement indéfiniment : on finit donc par atteindre 00, qui est le cas de base.

La pile d'appels : ce qui se passe en mémoire

Pendant que factorielle(2) attend le résultat de factorielle(1), elle n'est pas terminée : il faut garder en mémoire la valeur de son n et l'endroit où reprendre le calcul. L'interpréteur range ces informations dans une pile d'appels. À chaque appel, un nouveau « cadre » est empilé ; quand un appel renvoie sa valeur, son cadre est dépilé.

Récursivité sur les listes et les chaînes

Le document d'accompagnement d'Éduscol propose des exemples de programmes récursifs sur les chaînes de caractères, et un exercice sur la recherche du maximum d'une liste.1 Les structures de données elles-mêmes peuvent être récursives : un arbre binaire, par exemple, est soit vide, soit constitué d'un nœud qui porte deux arbres binaires de taille inférieure.3 Une liste se prête au même raisonnement : une liste est soit vide, soit un élément suivi d'une liste plus courte.

Plusieurs appels récursifs : l'exemple de Fibonacci

La suite de Fibonacci est définie par F0=0F_0 = 0, F1=1F_1 = 1 et, pour n≥2n \geq 2, Fn=Fn−1+Fn−2F_n = F_{n-1} + F_{n-2}. Les deux premiers termes sont les cas de base, ce qui correspond aux instructions fib(1) et fib(0) du programme récursif.1 Le sujet fait partie des activités que l'on demande aux élèves : programmer la fonction fib de façon récursive.1

Premières valeurs de la suite de Fibonacci
n01234567
fib(n)011235813
Premières valeurs de la suite de Fibonacci

Observe que fib(2) est calculé deux fois dans l'exemple de fib(4). Pour de grandes valeurs de n, les mêmes calculs sont refaits un très grand nombre de fois : le temps d'exécution explose. Ce phénomène illustre que le programme récursif peut être beaucoup plus lent que son équivalent itératif.1 On peut pallier ce défaut en mémorisant les résultats déjà calculés (technique de la mémoïsation, par exemple avec un dictionnaire), ou en écrivant une version avec boucle.

Diviser pour régner et récursivité croisée

Récursivité ou boucle ? Comparer les deux approches

Boucles et récursivité ont un point commun : elles permettent toutes deux de répéter un nombre d'étapes qu'on ne connaît pas à l'avance, puisqu'il dépend des données fournies au programme.3 Toute fonction récursive peut s'écrire avec une boucle, et inversement ; mais le résultat n'est pas toujours aussi lisible.

Il faut aussi savoir qu'un programme récursif peut être plus lent que son équivalent itératif.1

Récursivité et itération
CritèreRécursivitéBoucle
FormeAppel à soi-mêmefor ou while
ArrêtCas de baseCondition de boucle
MémoirePile d'appelsQuelques variables
Cas d'emploiArbres, diviser pour régnerRépétitions simples
Récursivité et itération

Méthode pour l'épreuve du bac

La récursivité fait régulièrement l'objet d'un exercice complet à l'épreuve écrite de spécialité NSI. Dans un sujet proposé par Éduscol, l'épreuve dure 3h30, comporte trois exercices indépendants, et l'un d'eux porte sur la récursivité pour 6 points ; la calculatrice n'est pas autorisée.2 Cela représente une part importante de la note, d'où l'intérêt de maîtriser les gestes suivants.

Exercices corrigés

Exercice 1 Compter les appels de factorielle

★☆☆Environ 8 min

On utilise la fonction factorielle du cours :

def factorielle(n):
    if n == 0:
        return 1
    else:
        return n * factorielle(n - 1)

Combien d'appels à factorielle (le premier appel compris) sont effectués quand on exécute factorielle(6) ? Donne aussi la valeur renvoyée.

Indice 1

Les arguments successifs sont 6, 5, 4, ... jusqu'au cas de base.

Indice 2

Compte aussi l'appel où l'argument vaut 0.

Voir la correction pas à pas
  1. Les arguments des appels successifs sont 6, 5, 4, 3, 2, 1, puis 0.

  2. L'appel avec l'argument 0 est le cas de base : il ne déclenche aucun nouvel appel.

  3. Il y a donc 7 appels au total, soit 6+16 + 1.

  4. Pour la valeur : 6!=6×5×4×3×2×1×1=7206! = 6 \times 5 \times 4 \times 3 \times 2 \times 1 \times 1 = 720.

Pour factorielle(n), il y a n+1n + 1 appels : la pile atteint n+1n + 1 cadres au plus profond.

Exercice 2 Calculer fib(7) à la main

★★☆Environ 12 min

On considère :

def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n - 1) + fib(n - 2)

Quelle valeur renvoie fib(7) ? Présente les valeurs de fib(0) à fib(7) dans l'ordre.

Indice 1

Calcule les valeurs dans l'ordre croissant plutôt que de dérouler tous les appels.

Indice 2

Chaque valeur est la somme des deux précédentes.

Voir la correction pas à pas
  1. Cas de base : fib(0) = 0 et fib(1) = 1.

  2. fib(2) = fib(1) + fib(0) = 1.

  3. fib(3) = fib(2) + fib(1) = 2 puis fib(4) = fib(3) + fib(2) = 3.

  4. fib(5) = 3 + 2 = 5 et fib(6) = 5 + 3 = 8.

  5. fib(7) = fib(6) + fib(5) = 8 + 5 = 13.

Calculer dans l'ordre croissant revient à écrire la version itérative : on ne refait aucun calcul, contrairement au programme récursif.

Exercice 3 Somme des chiffres d'un entier

★★☆Environ 15 min

On souhaite écrire une fonction récursive somme_chiffres(n) qui renvoie la somme des chiffres d'un entier n≥0n \geq 0 écrit en base 10. On rappelle que n % 10 est le dernier chiffre et n // 10 est l'entier privé de son dernier chiffre.

  1. Écris la fonction.
  2. Justifie sa terminaison.
  3. Calcule somme_chiffres(4825).
Indice 1

Le cas de base est atteint quand il n'y a plus de chiffre : n vaut 0.

Indice 2

Le variant peut être n lui-même.

Voir la correction pas à pas
  1. Cas de base : si n == 0, on renvoie 0.

  2. Cas récursif : on renvoie n % 10 + somme_chiffres(n // 10).

  3. Code : def somme_chiffres(n): / if n == 0: return 0 / return n % 10 + somme_chiffres(n // 10).

  4. Terminaison : le variant n est un entier positif ou nul ; n // 10 est strictement plus petit que n dès que n≥1n \geq 1 ; on atteint donc 0.

  5. Calcul : 4825→5+S(482)→5+2+S(48)→5+2+8+S(4)→5+2+8+4+S(0)=194825 \to 5 + S(482) \to 5 + 2 + S(48) \to 5 + 2 + 8 + S(4) \to 5 + 2 + 8 + 4 + S(0) = 19.

La somme des chiffres de 4825 est 19. Le même schéma (dernier élément traité, puis reste) fonctionne pour beaucoup de fonctions sur les entiers.

Exercice 4 Corriger une fonction qui ne se termine pas

★★★Environ 15 min

Voici une fonction censée renvoyer la somme 1+2+⋯+n1 + 2 + \dots + n :

def somme_jusqua(n):
    if n == 0:
        return 0
    return n + somme_jusqua(n - 2)
  1. Que se passe-t-il pour somme_jusqua(5) ? Pour somme_jusqua(4) ?
  2. Corrige la fonction.
  3. Quel variant utilises-tu pour justifier la terminaison de ta version ?
Indice 1

Écris les valeurs successives de l'argument pour n = 5.

Indice 2

Le pas de décroissance doit être 1.

Voir la correction pas à pas
  1. Pour n = 5, les arguments sont 5, 3, 1, -1, -3... : le cas de base n == 0 n'est jamais atteint, la fonction ne se termine pas (erreur RecursionError).

  2. Pour n = 4, les arguments sont 4, 2, 0 : la fonction s'arrête, mais elle renvoie 4+2=64 + 2 = 6 au lieu de 1+2+3+4=101 + 2 + 3 + 4 = 10 : le résultat est faux.

  3. Correction : remplacer l'appel par n + somme_jusqua(n - 1).

  4. Variant : n, entier positif ou nul qui diminue de 1 à chaque appel, donc qui atteint 0 (cas de base).

Deux défauts distincts apparaissaient : la non-terminaison pour les entiers impairs et un résultat faux pour les entiers pairs. Vérifier la terminaison et la correction sont deux étapes séparées.

Quiz

7 questions · correction immédiate · ton score reste sur ton appareil.

  1. Quel élément permet à une fonction récursive de se terminer ?

  2. Que renvoie factorielle(5) avec la fonction du cours ?

  3. Une fonction récursive qui n'a aucun cas de base se termine toujours, car chaque appel traite une donnée plus petite.

  4. Que se passe-t-il pour compte(5) avec def compte(n): if n == 0: return 0; return compte(n - 2) ?

  5. Quelles propositions sont vraies à propos de la suite de Fibonacci récursive du cours ?

    Plusieurs réponses possibles.

  6. Comment appelle-t-on deux fonctions qui s'appellent l'une l'autre ?

  7. Combien de cadres la pile d'appels contient-elle au plus profond lors de l'exécution de factorielle(4) ?

Les questions qu'on se pose

À quoi sert la récursivité, si une boucle peut faire la même chose ?

Toute fonction récursive peut s'écrire avec une boucle, mais la récursivité rend certains codes beaucoup plus courts et proches de la définition mathématique. Elle sert en particulier à traiter les structures de données récursives comme les arbres, et à exprimer le paradigme « diviser pour régner ».3 Elle n'est cependant pas toujours la plus rapide : un programme récursif peut être plus lent que son équivalent itératif.1

Comment savoir si ma fonction récursive va s'arrêter ?

Cherche un variant : une quantité entière positive ou nulle qui diminue strictement à chaque appel. Si elle atteint forcément une valeur correspondant au cas de base, la fonction se termine. Vérifie aussi que tous les chemins possibles aboutissent à un cas de base, pas seulement certaines valeurs de l'argument.

Pourquoi Python affiche-t-il « RecursionError : maximum recursion depth exceeded » ?

Chaque appel en attente occupe un cadre dans la pile, et Python limite leur nombre. L'erreur apparaît soit parce que la fonction ne se termine pas (cas de base oublié ou jamais atteint), soit parce que la profondeur nécessaire est simplement trop grande pour la limite fixée. Dans le second cas, une version avec boucle règle le problème.

Qu'est-ce qui tombe à l'épreuve de NSI sur ce chapitre ?

Dans un sujet publié par Éduscol, un exercice entier de 6 points porte sur la récursivité.2 On attend typiquement : dérouler un appel à la main, compléter ou écrire une fonction récursive, identifier les cas de base, justifier la terminaison et parfois comparer avec une version itérative.

Faut-il toujours mettre le cas de base en premier ?

Oui, c'est la bonne habitude. Si l'appel récursif est écrit avant de tester le cas de base, il est exécuté même quand il ne le faudrait pas et la fonction ne s'arrête pas. Tester d'abord le cas de base garantit que l'on ne rappelle la fonction que dans le cas général.

Sources

  1. Document d'accompagnement : Récursivité (PDF), Éduscol - Ministère de l'Éducation nationale. Consulté le 7 novembre 2026.
  2. Spécialité NSI - Numérique et Sciences Informatiques (STI Éduscol), Éduscol STI - Ministère de l'Éducation nationale. Consulté le 7 novembre 2026.
  3. Récursivité, Wikipédia. Consulté le 7 novembre 2026.
  4. Récursivité (linguistique), Wikipédia. Consulté le 7 novembre 2026.

Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page