🔄 La Récursivité
Une fonction est dite récursive si elle s'appelle elle-même dans sa propre définition. C'est un concept puissant pour résoudre des problèmes qui peuvent être décomposés en sous-problèmes identiques plus petits.
1. Anatomie d'une fonction récursive
Pour qu'une fonction récursive fonctionne correctement (et ne tourne pas à l'infini 💥), elle doit impérativement comporter deux parties :
- Le Cas de Base (Condition d'arrêt) : C'est la situation simple où la fonction peut répondre directement sans s'appeler elle-même. C'est ce qui arrête la récursion.
- L'Appel Récursif : La fonction s'appelle elle-même avec des arguments qui la rapprochent du cas de base.
Exemple : La Factorielle
La factorielle de () est le produit des nombres de 1 à .
- Mathématiquement :
- pour
def factorielle(n):
# 1. Cas de base
if n == 0:
return 1
# 2. Appel récursif
else:
return n * factorielle(n - 1)
2. La Pile d'Exécution (Call Stack)
Comment l'ordinateur gère-t-il cela ? Il utilise une pile. Imaginez une pile d'assiettes. À chaque appel de fonction, on ajoute une assiette (un contexte d'exécution) sur la pile. Quand une fonction se termine (return), on retire l'assiette.
Exemple pour factorielle(3) :
- Appel
factorielle(3): besoin defactorielle(2)-> Empile - Appel
factorielle(2): besoin defactorielle(1)-> Empile - Appel
factorielle(1): besoin defactorielle(0)-> Empile - Appel
factorielle(0): renvoie1(Cas de base !) -> Dépile - Reprise
factorielle(1): calcule1 * 1 = 1-> Dépile - Reprise
factorielle(2): calcule2 * 1 = 2-> Dépile - Reprise
factorielle(3): calcule3 * 2 = 6-> Dépile - Résultat final : 6.
⚠️ Stack Overflow : Si vous oubliez le cas de base ou si la récursion est trop profonde (par défaut 1000 en Python), la pile déborde et le programme plante (RecursionError).
3. Récursif vs Itératif
Tout programme récursif peut être écrit de manière itérative (avec des boucles for ou while), et inversement.
- Itératif : Souvent plus efficace en mémoire (pas d'empilement).
- Récursif : Souvent plus élégant et plus simple à écrire pour certains problèmes (arbres, graphes, tours de Hanoï).
Somme des entiers
Écrivez une fonction récursive somme(n) qui calcule la somme des entiers de 0 à n.
- Exemple :
somme(4)doit renvoyer4 + 3 + 2 + 1 + 0 = 10.
Indices :
- Cas de base : Quelle est la somme si n = 0 ?
- Récursion :
somme(n) = n + somme(...)?