Bonjour ! Bienvenue dans cette nouvelle leçon sur la récursivité. J'espère que vous êtes prêt(e) à passer de la théorie à la pratique.
Introduction
Dans la leçon précédente, nous avons disséqué l'anatomie d'une fonction récursive. Nous avons appris à identifier ses deux composantes cruciales : le cas de base, qui stoppe la récursivité, et le cas récursif, où la fonction s'appelle elle-même pour se rapprocher de la solution.
L'objectif d'aujourd'hui est de franchir une étape décisive : nous allons écrire notre première fonction récursive simple en pseudo-code. Nous allons assembler les briques que nous avons identifiées pour construire un algorithme fonctionnel. Pour ce faire, nous reprendrons l'exemple du calcul de la factorielle, un problème désormais familier qui se prête parfaitement à cet exercice. En fin de leçon, vous serez capable de traduire une définition mathématique récursive en un algorithme concret.
1. La méthode pour écrire une fonction récursive
Avant de nous lancer dans le code, rappelons la stratégie générale. Écrire une fonction récursive est une démarche très structurée.
La récursivité - Zeste de Savoir
L'article "La récursivité" de Zeste de Savoir résume très bien cette méthode. Il nous guidera dans notre approche.
Lisez la section "Comment écrire une fonction récursive ?". Concentrez-vous sur les deux étapes clés décrites : la gestion du cas simple d'abord, puis la gestion des sous-problèmes récursifs.
Comme vous l'avez lu, la recette est presque toujours la même :
- Traiter le cas de base : On commence par écrire la condition qui arrête la récursivité. C'est le cas le plus simple du problème, celui pour lequel on connaît la réponse directement. Cela se traduit souvent par une structure
SI ... ALORS RETOURNER une_valeur_simple. - Traiter le cas récursif : Ensuite, on gère tous les autres cas. C'est ici que l'on formule la solution du problème en fonction de la solution d'un problème plus petit. C'est l'appel récursif. Il se trouve généralement dans la partie
SINONde la structure conditionnelle.
Appliquons immédiatement cette méthode au calcul de la factorielle.
2. Écriture de la fonction factorielle
Rappelons la définition mathématique de la factorielle :
- Cas de base :
- Cas récursif : pour
Nous avons tout ce qu'il nous faut pour écrire notre fonction.
Initiation à l'Algorithmique Cours et exercices corrigés
Le document "Initiation à l'Algorithmique" que nous avons déjà consulté propose une implémentation directe de cette logique en pseudo-code. Observons comment la définition mathématique est traduite en algorithme.
Lisez la section "5.1. Exemple illustratif". Comparez la "Définition récursive" mathématique avec la "Solution récursive" en pseudo-code juste en dessous (la solution 'b)'). Vous verrez une correspondance quasi parfaite.
Voici le pseudo-code que vous venez de voir, que nous allons analyser ensemble :
Fonction FACTORIELLE(n : Entier) : Entier
DEBUT
// Étape 1 : Gérer le cas de base
SI (n = 0) ALORS
RETOURNER 1
// Étape 2 : Gérer le cas récursif
SINON
RETOURNER n * FACTORIELLE(n - 1)
FIN SI
FIN
Décortiquons cet algorithme :
Fonction FACTORIELLE(n : Entier) : Entier: C'est la signature de la fonction. Elle s'appelleFACTORIELLE, prend un paramètrende typeEntier, et retourne un résultat de typeEntier.SI (n = 0) ALORS RETOURNER 1: Voici notre cas de base. Si la fonction est appelée avec l'argument0, elle retourne immédiatement1sans autre appel. La récursivité s'arrête ici.SINON RETOURNER n * FACTORIELLE(n - 1): C'est le cas récursif. Sinn'est pas0, la fonction retourne le résultat denmultiplié par le résultat de l'appel à elle-même (FACTORIELLE) avec un argument plus petit (n - 1). C'est ici que la "magie" opère.
3. Comment ça marche ? Le traçage des appels
Écrire la fonction est une chose, mais il est fondamental de comprendre comment l'ordinateur l'exécute. Ce processus peut sembler déroutant au début. Visualisons-le.
Imaginons que nous voulons calculer FACTORIELLE(4).

Le processus se déroule en deux temps :
-
La descente (ou l'empilement des appels) :
FACTORIELLE(4)est appelé. Puisque4 ≠ 0, il doit calculer4 * FACTORIELLE(3). Il se met en pause en attendant le résultat.FACTORIELLE(3)est appelé. Puisque3 ≠ 0, il doit calculer3 * FACTORIELLE(2). Il se met en pause.FACTORIELLE(2)est appelé. Puisque2 ≠ 0, il doit calculer2 * FACTORIELLE(1). Il se met en pause.FACTORIELLE(1)est appelé. Puisque1 ≠ 0, il doit calculer1 * FACTORIELLE(0). Il se met en pause.FACTORIELLE(0)est appelé. Le cas de base est atteint !
-
La montée (ou le dépilement et le calcul) :
FACTORIELLE(0)retourne1.FACTORIELLE(1), qui attendait, reçoit1. Il peut finir son calcul :1 * 1et retourne1.FACTORIELLE(2), qui attendait, reçoit1. Il peut finir son calcul :2 * 1et retourne2.FACTORIELLE(3), qui attendait, reçoit2. Il peut finir son calcul :3 * 2et retourne6.FACTORIELLE(4), qui attendait, reçoit6. Il peut finir son calcul :4 * 6et retourne24.
Le résultat final est 24.
Pour renforcer cette idée, voici une autre façon de visualiser le traçage, sous forme de texte.
La récursivité - Zeste de Savoir
L'article de Zeste de Savoir explique ce même processus mental pour calculer fac(3). Cette trace textuelle est une autre excellente façon de se représenter la séquence des opérations.
Lisez attentivement le bloc de texte qui commence par "fac 3 : 3 ne vaut pas 1, donc je continue". Suivez la logique d'interruption et de reprise des calculs.
4. À vous de jouer !
Maintenant que vous avez vu comment construire et tracer une fonction récursive, il est temps de mettre la main à la pâte. Votre préférence pour la pratique va être servie !
Problème : Écrire une fonction récursive SommeCarres(n) qui calcule la somme des carrés des n premiers entiers.
Par exemple, SommeCarres(3) doit calculer .
La formule est :
En utilisant la méthode vue plus haut, essayez d'écrire cette fonction en pseudo-code. Pour cela, répondez d'abord à ces deux questions :
- Quelle est la version la plus simple de ce problème ? (le cas de base)
- Comment pouvez-vous exprimer en fonction de ? (le cas récursif)
Prenez un papier et un crayon, et essayez de formuler l'algorithme complet.
...
Solution :
- Cas de base : Le cas le plus simple est de calculer la somme des carrés pour
n=0. La somme est vide, donc le résultat est0.SommeCarres(0) = 0. - Cas récursif : La somme des carrés jusqu'à
nest simplement la somme des carrés jusqu'àn-1, à laquelle on ajoutenau carré.
Donc, .
En termes de fonction :SommeCarres(n) = SommeCarres(n-1) + n*n.
Avec ces deux éléments, nous pouvons écrire le pseudo-code :
Fonction SommeCarres(n : Entier) : Entier
DEBUT
// Cas de base
SI (n = 0) ALORS
RETOURNER 0
// Cas récursif
SINON
RETOURNER n*n + SommeCarres(n - 1)
FIN SI
FIN
Félicitations si vous avez trouvé une solution similaire ! C'est exactement la même structure logique que pour la fonction factorielle.
Conclusion
Aujourd'hui, vous avez franchi une étape majeure en passant de l'analyse à la création. Vous avez écrit votre première fonction récursive, en suivant une méthode structurée qui sera votre guide pour des problèmes bien plus complexes.
Les points clés à retenir :
- L'écriture d'une fonction récursive suit une méthode en deux temps : d'abord le cas de base, ensuite le cas récursif.
- La structure
SI ... SINON ...est l'outil parfait pour implémenter cette logique. - La définition mathématique d'un problème récursif se traduit presque directement en pseudo-code.
- Comprendre le mécanisme de "descente" (empilement des appels) et de "montée" (calcul des retours) est essentiel pour maîtriser la récursivité.
Et après ?
Nous avons visualisé l'exécution d'une fonction récursive de manière intuitive. Dans la prochaine leçon, nous allons formaliser ce processus. Nous apprendrons à tracer l'exécution d'une fonction récursive simple en utilisant la "pile d'appels". C'est un outil mental et technique indispensable pour comprendre en profondeur, déboguer, et analyser le comportement de vos futurs algorithmes récursifs.