• 20 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 17/11/2023

Découvrez la récursivité, ou l'appel de fonctions depuis elles-mêmes

Appréhendez le principe de la récursivité

Dans ce chapitre, nous allons aborder l'un des concepts fondamentaux de la programmation : la récursivité. Commençons par regarder la récursivité dans le contexte des mathématiques factorielles. Vous vous souvenez de ce qu'est une factorielle ? Vous avez peut-être vu ce concept en cours de mathématiques. Il se présente comme suit :

5! = 5 * 4 * 3 * 2 * 1

4! = 4 * 3 * 2 * 1

3! = 3 * 2 * 1

Cela vous revient ? En fait, le fonctionnement d'une factorielle nous permet d'illustrer la récursivité en C#. Une autre façon plus abstraite de l'écrire serait :

N! = N * (N-1)!

En utilisant des chiffres, cela donne :

5! = 5 * (5-1)!  c'est-à-dire  5! = 5 * (4)!  et au final  5! = 5 * 4!  .

Mais, en suivant cette formule, nous pouvons également écrire  4!  sous la forme  4 * (4-1)!  , ce qui nous donne  4 * 3!  .Nous pouvons ainsi revenir à  5! = 5 * 4!  pour obtenir  5! = 5 * (4 * 3!)  .

Une minute ! En regardant notre nouvelle version,  3!  peut également utiliser cette formule ! Ce qui va finalement nous donner :   5! = 5 * 4 * (3 * 2!)  . Nous pouvons recommencer avec  2!  .

Même si vous n'êtes pas très doué en maths, vous pouvez voir ici que la formule factorielle est utilisée à plusieurs reprises. Du point de vue du code, vous pouvez créer une fonction qui s'exécute de façon répétée, comme ici, jusqu'à ce que vous ayez une réponse complète. Comment écrire une factorielle en C# en utilisant des opérateurs ? Essayons :

// Définir des classes
class RecursiviteEnCSharp
{
    public static int Factorielle(int n)
    {
        n = n * Factorielle (n - 1);
    }
}

Si vous regardez attentivement la ligne  n = n * Factorielle(n-1)  , vous constaterez que la méthode factorielle est appelée à l'intérieur d'elle-même. C'est ce qu'on appelle la récursivité, parce que la méthode s'exécute en continu en s'appelant elle-même.

Vous vous souvenez des instructions conditionnelles comme if/else ? Elles empêchent à une instruction de continuer jusqu’à l'infini en arrêtant la méthode pour une raison donnée. Pourquoi voudriez-vous arrêter cette méthode ? Lorsque vous résolvez une équation factorielle, elle se termine à 1. En fait, vous devez créer une instruction conditionnelle qui mettra fin à la récursion lorsque n sera égal à 1.

Il en résulte deux choses :

  1. La méthode factorielle s'arrêtera lorsque n sera égal à 1.

  2. Si le nombre d'origine est 1, l'instruction renvoie simplement 1.

Voyons ce que cela donne :

// Définir des classes
class RecursiviteEnCSharp
{
    public static int Factorielle(int n)
    {
        if (n == 1)
        {
            return 1;
        }
        else
        {
            return n * Factorielle(n - 1);
        }
    }
}

Revenons maintenant à l'exemple de la librairie comme mentionné dans la vidéo 📚. Si vous voulez compter les livres dans chaque catégorie, chaque sous-catégorie, et ainsi de suite, vous devez vous assurer que vous prenez en compte tous les niveaux. Pour ce faire, vous pouvez créer une fonction qui va parcourir le premier niveau de catégories. Puis, une fois terminée, cette fonction s'appellera elle-même, mais cette fois sur les sous-catégories de l'une des catégories d'origine. Cette itération ira plus loin et s'appellera elle-même à nouveau pour traiter des sous-catégories jusqu'à ce qu'il n'y ait plus de sous-catégories. De cette façon, vous pouvez aller jusqu'au tout dernier sous-niveau de chaque catégorie d'origine. Et si une catégorie n'a pas de sous-catégories, votre fonction reviendra à votre point de départ.

Voici à quoi ressemble le code qui implémente cela en C# :

class Librairie
{
    // Définir une fonction récursive
    public static int CompterLivres(Categories categories)
    {
        int c = 0;
        foreach (Categories categorie in categories)
        {
            c += categorie.nombreDeLivres;
            CompterLivres(categorie.sousCategories);
        }
        return c;
    }
}

// Appeler la fonction récursive
int nombreDeLivres = Librairie.CompterLivres(Librairie.categories);
Console.WriteLine("La librairie dispose de " + nombreDeLivres + " livres");

Très efficace, n'est-ce pas ?

En termes techniques, la récursivité est une action qui s'initialise à l'intérieur d'elle-même. Elle continue de descendre niveau après niveau, jusqu'à ce qu'une condition soit remplie, puis remonte jusqu'au premier niveau.

En résumé 

  • La récursivité est une action qui s'initialise à l'intérieur d'elle-même.

  • Les méthodes récursives servent à parcourir des structures organisées en niveaux.

Exemple de certificat de réussite
Exemple de certificat de réussite