Récursivité et diviser pour régner
Cas de base, récurrence
Rédigé par l'équipe éditoriale de RévisionBac d'après le programme officiel · Mis à jour le · Méthodologie
En clair. Cas de base, récurrence
Ce qu'on te demande au bac (Spé NSI) : maîtriser le vocabulaire de « Récursivité et diviser pour régner », savoir refaire les raisonnements du cours et les réutiliser sur un sujet ou un document nouveau.
Conseil de révision. Lis d'abord cet encadré, puis fais le quiz : si tu bloques, reprends la partie du cours correspondante.
Définition
Une fonction est récursive lorsqu'elle s'appelle elle-même sur une donnée plus petite, jusqu'à atteindre un cas de base qui arrête la descente. Toute fonction récursive correcte comporte deux éléments indissociables :
- un ou plusieurs cas de base (terminaison) ;
- un cas récursif qui se rapproche strictement du cas de base.
def factorielle(n):
if n <= 1: # cas de base
return 1
return n * factorielle(n - 1) # cas récursif
Pile d'appels et coût
Chaque appel empile un contexte (paramètres, adresse de retour) dans la pile d'exécution. La profondeur maximale est limitée : en Python, sys.setrecursionlimit vaut 1000 par défaut, et un dépassement lève RecursionError.
Coût de factorielle(n) : appels, donc complexité temporelle et spatiale (à cause de la pile), là où une boucle serait en d'espace.
Diviser pour régner
La stratégie diviser pour régner décompose un problème de taille en sous-problèmes indépendants de taille , les résout récursivement, puis combine les résultats.
Recherche dichotomique dans un tableau trié :
def dicho(t, v, g, d):
if g > d:
return -1
m = (g + d) // 2
if t[m] == v:
return m
if t[m] < v:
return dicho(t, v, m + 1, d)
return dicho(t, v, g, m - 1)
À chaque étape la zone de recherche est divisée par 2 : complexité . Pour , environ 20 comparaisons suffisent.
Tri fusion :
def tri_fusion(t):
if len(t) <= 1:
return t
m = len(t) // 2
return fusion(tri_fusion(t[:m]), tri_fusion(t[m:]))
Complexité dans tous les cas, contre pour le tri par insertion dans le pire cas.
Piège : la récursivité multiple
def fibo(n):
if n <= 1:
return n
return fibo(n - 1) + fibo(n - 2)
Cette version recalcule les mêmes valeurs : nombre d'appels exponentiel, . fibo(40) demande déjà plus de 300 millions d'appels. Remède : la mémoïsation, qui mémorise les résultats déjà calculés et ramène le coût à .
def fibo(n, memo={}):
if n <= 1:
return n
if n not in memo:
memo[n] = fibo(n - 1, memo) + fibo(n - 2, memo)
return memo[n]
Méthode : écrire une fonction récursive
- Identifier le cas le plus petit et sa valeur de retour.
- Exprimer le résultat pour à l'aide du résultat pour une taille strictement inférieure.
- Vérifier que chaque appel réduit bien la taille (sinon boucle infinie).
- Tester sur le cas de base, puis sur deux ou trois petites valeurs à la main.
Erreurs fréquentes
- Oublier le cas de base ou ne jamais l'atteindre →
RecursionError. - Placer le
returnseulement dans le cas récursif : la fonction renvoieNone. - Croire que récursif = plus efficace : c'est souvent plus lisible, rarement plus rapide.
- Utiliser des tranches
t[:m]sans compter leur coût : chaque copie est en .
Quiz corrigé
1. Quels sont les deux ingrédients obligatoires d'une fonction récursive ? → Un cas de base qui termine, et un cas récursif qui se rapproche de ce cas de base.
2. Quelle est la complexité de la recherche dichotomique et pourquoi ? → : l'intervalle de recherche est divisé par deux à chaque appel.
3. Pourquoi la version naïve de Fibonacci est-elle inutilisable pour n = 50 ? → Les sous-appels sont recalculés un nombre exponentiel de fois ; il faut mémoïser pour revenir à .
Sources et références
Ce cours est rédigé par l'équipe RévisionBac à partir du programme officiel et des sources institutionnelles ci-dessous. Elles permettent de vérifier les définitions, les chiffres et les normes citées.
- 1.Programmes et ressources du lycée général et technologique — Éduscol — Ministère de l'Éducation nationale
- 2.Bulletin officiel de l'Éducation nationale (programmes du baccalauréat) — education.gouv.fr
- 3.Ressources et programme de NSI — Éduscol
- 4.Documentation du langage Python — Python Software Foundation
- 5.Protection des données et RGPD — CNIL
Contenu vérifié et mis à jour le 10/09/2026. Les liens renvoient vers les sites officiels des éditeurs cités.
Historique éditorial
Ce chapitre est rédigé et relu par l'équipe RévisionBac, puis enrichi par les contributions validées.
- — Dernière mise à jour du cours (relecture et enrichissement)
- — Première publication de la fiche de cours