Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 39

Introduction à la Récursivité

Recommended resources

Bonjour ! Bienvenue dans cette nouvelle leçon qui marque le début d'un nouveau module passionnant.

Introduction

Dans les modules précédents, nous avons exploré les structures de données séquentielles comme les tableaux, et les structures linéaires comme les piles et les files. Vous avez appris à les manipuler avec des boucles (Pour, Tant que) pour résoudre des problèmes de manière itérative, c'est-à-dire en répétant une série d'étapes.

Aujourd'hui, nous allons aborder une approche de résolution de problèmes complètement différente et très puissante : la récursivité. L'objectif de cette leçon est de vous amener à définir le concept de récursivité, c'est-à-dire comprendre ce que signifie pour une fonction de s'appeler elle-même. C'est une pierre angulaire de l'algorithmique, et la maîtriser vous ouvrira les portes de solutions élégantes à des problèmes complexes, ce qui est essentiel pour écrire du "code clean".


1. Qu'est-ce que la récursivité ? Une première approche

Pour commencer, voyons une définition simple et directe de la récursivité. L'idée centrale est assez intuitive, même si son application peut sembler déroutante au premier abord.

Comprendre la récursivité en 7 min

L'article "Comprendre la récursivité en 7 min" de 'Je suis un dev' donne une excellente définition de départ. Il présente le concept de manière très accessible.

Lisez la première partie de l'article, jusqu'à la phrase "on peut commencer à regarder du code". Concentrez-vous sur la définition en gras et l'idée d'appels de fonction "imbriqués".

Comme l'explique l'article, la récursivité, c'est quand une fonction s'appelle elle-même.

Imaginez une fonction comme une tâche à accomplir. Une fonction récursive est une tâche qui, pour se réaliser, se confie une version légèrement plus simple de cette même tâche. Ce processus se répète jusqu'à ce que la tâche devienne si simple qu'elle peut être résolue directement, sans nouvel appel.

Pour visualiser cela, voici un diagramme simple qui illustre ce flux :

Diagramme de Fonction Récursive
Ce schéma montre le cœur de la récursivité : un "Appel initial" entre dans la fonction, qui effectue ensuite un ou plusieurs "Appels intermédiaires" à elle-même avant de produire une "Sortie finale".

Le point crucial à retenir de cette première définition est le concept d'auto-référence : la fonction F contient dans sa définition un appel à la fonction F.


2. Penser de manière récursive : Un exemple sans code

Votre mode de pensée actuel est principalement itératif. Si je vous demande de compter un tas de 100 billes, vous allez probablement :

  1. Prendre un compteur initialisé à 0.
  2. Prendre une bille, incrémenter le compteur à 1.
  3. Prendre une autre bille, incrémenter le compteur à 2.
  4. ... Répéter cette boucle jusqu'à ce qu'il n'y ait plus de billes.

C'est une approche itérative, utilisant une boucle. Maintenant, voyons comment un esprit "récursif" aborderait le problème.

L'approche récursive consiste à décomposer le problème en un sous-problème de même nature :

  • Le nombre total de billes dans un tas est égal à 1 (la bille que je tiens) + le nombre de billes dans le reste du tas.

Vous voyez la logique ? Pour connaître le total, je me pose la même question sur un tas légèrement plus petit. Je continue ce processus jusqu'à ce que j'arrive à un tas vide. Le nombre de billes dans un tas vide est 0. C'est ma condition d'arrêt.

Pour approfondir cette distinction fondamentale, lisez l'extrait suivant.

Récursivité - l'Informatique, c'est fantastique

L'article "Récursivité" du site 'l'Informatique, c'est fantastique' offre une comparaison très claire entre les approches itérative et récursive en utilisant cet exemple des billes.

Lisez les sections "Algorithme itératif vs récursif" et les deux sous-sections "Approche itérative" et "Approche récursive". Cela vous aidera à bien contraster les deux modes de pensée.

Cette idée de "diviser pour régner" en réduisant le problème à une version plus simple de lui-même est l'essence de la pensée récursive.


3. La fonction récursive formelle

Maintenant que nous avons l'idée conceptuelle, formalisons-la en termes de fonctions, comme nous les avons vues dans le module 5.

Une fonction récursive est une fonction qui s'appelle elle-même dans son propre corps.

Prenons un exemple mathématique classique : le calcul de la puissance d'un nombre, disons .
De manière itérative, vous multiplieriez par lui-même fois à l'aide d'une boucle.

De manière récursive, on remarque que :

Par exemple, . Et , et ainsi de suite.
On a décomposé le calcul de en un calcul plus simple (celui de ) de la même fonction "puissance".

Ce processus doit s'arrêter. Le cas le plus simple est quand l'exposant est 0. On sait que n'importe quel nombre à la puissance 0 vaut 1 (par convention, ). C'est notre condition d'arrêt.

On peut donc définir la fonction puissance de cette façon :

Voyez-vous comment la fonction puissance est définie en utilisant un appel à elle-même ? C'est ça, une définition récursive !

Récursivité - l'Informatique, c'est fantastique

Retournons sur l'article 'Récursivité' pour voir comment cet exemple de la fonction puissance est formalisé.

Lisez la section "Fonctions récursives" jusqu'à la fin de l'exemple sur la fonction exponentiation. Observez bien comment la formule mathématique se traduit en structure d'algorithme.

Le pseudo-code d'une telle fonction ressemblerait à ceci :

FONCTION puissance(x : Réel, y : Entier) : Réel
DEBUT
    SI y = 0 ALORS
        RETOURNER 1  // C'est la condition d'arrêt
    SINON
        RETOURNER x * puissance(x, y - 1) // C'est l'appel récursif
    FIN SI
FIN

Cet algorithme est la traduction directe de la définition mathématique que nous avons vue. C'est la structure fondamentale de toute fonction récursive.


Conclusion

Aujourd'hui, nous avons fait le premier pas dans le monde de la récursivité. C'est un concept qui demande un petit temps d'adaptation, car il nous force à penser différemment de la logique des boucles à laquelle nous sommes habitués.

Les points clés à retenir sont :

  • Définition : La récursivité est un processus par lequel une fonction s'appelle elle-même.
  • Principe : Elle résout un problème en le décomposant en sous-problèmes de même nature, mais de taille inférieure.
  • Nécessité : Une fonction récursive doit impérativement avoir une condition d'arrêt (aussi appelée "cas de base") pour éviter de s'appeler indéfiniment.

Et après ?

Nous avons défini ce qu'est la récursivité. Dans la prochaine leçon, nous allons nous concentrer sur ses deux composantes vitales que nous venons d'entrevoir : le cas de base (la condition d'arrêt) et le cas récursif (l'appel à soi-même). Comprendre comment bien les définir est la clé pour écrire des algorithmes récursifs corrects et efficaces. Nous commencerons alors à écrire nos propres fonctions récursives simples.