Prepa Help
Prepa Help › Cours › Informatique, 1re année

Récursivité en Python : cours et exercices corrigés de prépa

Fonctions récursives : cas de base et appel récursif, pile d'appels et arbre des appels, terminaison, récursivité et itération, exemples classiques (factorielle, puissance rapide, dichotomie, Hanoï).

Les nombres sont ceux du chapitre complet ; chaque filière voit la partie qui correspond à son programme.

Une fonction récursive est une fonction qui s'appelle elle-même sur une donnée plus petite, jusqu'à un cas de base résolu sans appel. Elle sert à traduire directement une définition par récurrence et à écrire les algorithmes qui coupent en deux : dichotomie, puissance rapide, tours de Hanoï, parcours de structures imbriquées. Le chapitre est au programme d'informatique de première année en MPSI, PCSI, PTSI, TSI et TPC, au Maroc et en France ; les sujets du CNC, de CCINP, de Mines-Ponts et de X-ENS posent des questions de récursivité, reprises dans les exercices. Tu y trouves la récursivité en Python écrite en trois temps, la pile d'appels, la terminaison et la complexité d'une fonction récursive.

Ce que tu sauras faire

Une fonction récursive résout un problème en s'appelant elle-même sur un problème plus petit. Cette façon de penser simplifie tous les problèmes qui contiennent des copies plus petites d'eux-mêmes : une palmeraie divisée en parcelles, une recherche dans une liste triée, un arbre, une figure qui se répète. À la fin de ce chapitre, tu dois savoir :

L'essentiel : Écrire une fonction récursive Extrait gratuit

Un extrait de la fiche « L'essentiel » du chapitre. Les démonstrations sont dans le cours détaillé.

À retenir Les trois temps
  1. La variable sur laquelle on récurse, qui diminue d'un appel à l'autre.
  2. Le cas de base : la plus petite valeur, résolue sans appel.
  3. Le cas récursif : on suppose les appels plus petits justes, et l'on en déduit la réponse.

Pour une fonction qui renvoie une valeur, le résultat de l'appel se renvoie : return n * fact(n - 1), jamais l'appel seul. Une variable locale est recréée à chaque appel.

def f(n):
    if n == 0:             # cas de base
        return ...
    return ... f(n - 1)    # cas récursif

Une méthode du chapitre Extrait gratuit

Un exercice corrigé Extrait gratuit

Dans le chapitre complet

Le cours détaillé, toute la fiche « L'essentiel », 21 méthodes, 20 pièges corrigés, la carte mentale, 37 exercices corrigés, 4 problèmes de concours, les fiches à mémoriser et l'assistant qui répond à tes questions. Ce chapitre est offert : il s’ouvre en entier avec un compte d’essai gratuit.

Ouvrir l'essai gratuit

Plan du cours

Les méthodes du chapitre

Chaque méthode est une fiche : quand l'utiliser, le rappel de cours, les étapes, la rédaction attendue sur la copie, un exemple traité, les erreurs à éviter.

  1. Écrire une fonction récursive en trois temps
  2. Traduire une définition par récurrence en fonction récursive
  3. Choisir et vérifier les cas de base
  4. Construire le résultat avec la valeur renvoyée par l'appel
  5. Respecter une signature imposée avec une fonction auxiliaire
  6. Prévoir le résultat d'un appel : descente, puis remontée
  7. Dresser le tableau des états de la pile d'appels
  8. Dessiner l'arbre des appels et compter les appels
  9. Prévoir l'ordre des affichages
  10. Justifier la terminaison
  11. Prouver la correction par récurrence
  12. Récurser sur une liste ou une chaîne : indice ou tranche
  13. Parcourir une structure imbriquée
  14. Écrire une dichotomie récursive à deux bornes
  15. Écrire la puissance rapide et compter ses multiplications
  16. Compter les appels et les opérations d'une fonction récursive
  17. Éviter la limite de la pile
  18. Passer de l'itératif au récursif, et inversement
  19. Énumérer toutes les sous-listes ou toutes les permutations
  20. Fixer des bornes par défaut et compter les appels avec une variable globale
  21. Parcourir une liste imbriquée quelconque avec isinstance

Les exercices corrigés

Chaque exercice a ses indications, sa correction rédigée et ce qu'il faut en retenir.

Application directe (15)

Entraînement (16)

Approfondissement (6)

Les problèmes de concours

Des extraits de sujets réels, corrigés en entier, avec la durée conseillée et les méthodes mobilisées.

Questions fréquentes

Comment écrire une fonction récursive en Python ?

En trois temps. On choisit la variable sur laquelle on récurse, qui diminue d'un appel à l'autre. On écrit le cas de base, la plus petite valeur, résolue sans appel. On écrit le cas récursif en supposant les appels plus petits justes. Pour une fonction qui renvoie une valeur, on renvoie le résultat de l'appel : return n * fact(n - 1), jamais l'appel seul.

Qu'est-ce que la pile d'appels en récursivité ?

Chaque appel a ses propres variables locales, et l'appelant attend la valeur renvoyée. Les appels en attente sont empilés : le dernier commencé est le premier terminé. L'exécution descend jusqu'au cas de base, puis les valeurs remontent. Un print placé avant l'appel récursif s'exécute à la descente ; placé après, il s'exécute à la remontée, dans l'ordre inverse.

Que veut dire RecursionError: maximum recursion depth exceeded ?

Python a dépassé le nombre d'appels en attente qu'il accepte : sys.getrecursionlimit() vaut 1000. Cela arrive quand le cas de base n'est jamais atteint, parce qu'il manque ou que la variable ne diminue pas. Si la fonction est juste mais demande de l'ordre de 1000 appels en attente ou plus, on écrit une boucle à la place ; une copie de concours n'emploie pas sys.setrecursionlimit.

Comment prouver qu'une fonction récursive termine ?

On exhibe un variant : pour toute entrée permise, chaque appel porte sur une quantité entière, positive ou nulle, strictement plus petite, et les cas de base couvrent les plus petites valeurs. La correction se prouve ensuite par récurrence sur cette quantité : l'initialisation correspond au cas de base, l'hérédité au cas récursif. On utilise une récurrence forte quand l'appel porte sur n//2n // 2 ou sur une sous-structure.

Quelle est la complexité d'une fonction récursive ?

On compte le nombre d'appels, qui mesure le travail, et la profondeur, qui mesure la place dans la pile. C(n)=C(n−1)+1C(n) = C(n - 1) + 1 donne un coût linéaire, comme fact ; C(n)=C(n//2)+1C(n) = C(n // 2) + 1 un coût logarithmique, comme la puissance rapide ou la dichotomie ; C(n)=2C(n−1)+1C(n) = 2C(n - 1) + 1 un coût exponentiel, comme Hanoï. fib(30) fait 2 692 537 appels, mais au plus 30 en attente.

Quelle différence entre récursivité simple, double et mutuelle ?

Une récursivité simple fait au plus un appel récursif par exécution, comme fact ou la puissance rapide. Une récursivité double, ou multiple, fait deux appels ou plus, comme fib ou hanoi. Une récursivité mutuelle, ou croisée, met en jeu deux fonctions qui s'appellent l'une l'autre, comme est_pair et est_impair.

Comment y accéder

Ce chapitre fait partie des chapitres offerts : il s'ouvre en entier avec un compte d'essai gratuit. Créer un compte d'essai ou se connecter. Pour l'accès complet, les tarifs ou une question, écris-nous sur WhatsApp.

Toute ta prépa au même endroit

Pour chaque chapitre : le cours, l'essentiel, les méthodes, les pièges, les exercices corrigés, les problèmes de concours, et un assistant qui répond à tes questions. Programmes du Maroc et de France.

Essayer gratuitement Prepa Help

← Bases de Python : expressions, types, instructions, fonctions