Chargement...

Récursivité en Java

Écrivez une méthode nommée down qui prend un int nommé n. Si n vaut 0 ou moins, arrêtez avec un return; nu. Sinon affichez n, puis appelez down(n - 1) depuis la même méthode. Depuis main, appelez down(3);. L'écran doit montrer trois lignes : 3, puis 2, puis 1. La méthode s'appelle avec un nombre plus petit jusqu'à ce que l'arrêt termine la chaîne. Cet auto-appel avec arrêt est ce que cette page enseigne.

Une méthode qui s'appelle elle-même

Sur la page de portée, mark s'exécutait une fois et terminait. Ici down s'exécute, puis démarre un autre down avec un nouvel argument avant que le premier appel soit tout à fait fini. Chaque appel a son propre n. La chaîne ne se termine que lorsqu'un appel touche l'arrêt.
Créez un petit fichier programme nommé Ladder.java. Le public class de la première ligne doit correspondre au nom du fichier : public class Ladder. Ne laissez pas un ancien nom de classe Gate ou Sign dans ce fichier ; le compilateur attend que le nom de classe et le nom de fichier concordent.
Hors de main, toujours dans les accolades de la classe, écrivez static void down(int n). Sur cette page gardez void : chaque étape affiche, et rien n'a besoin de revenir via un return typé. L'arrêt utilise return; sans valeur — cela termine seulement cet appel. Enregistrez le fichier avant de compiler. Le premier programme complet est dans la boîte suivante.

Ladder.java avec down

C'est la version que vous compilez d'abord. main contient un appel. down contient l'arrêt, l'affichage et l'auto-appel.

down prints then calls itself

java
public class Ladder {
    public static void main(String[] args) {
        down(3);
    }

    static void down(int n) {
        if (n <= 0) {
            return;
        }
        System.out.println(n);
        down(n - 1);
    }
}

Depuis le dossier qui contient Ladder.java, exécutez javac Ladder.java. Quand parenthèses, accolades et points-virgules concordent, javac n'écrit aucune ligne de son côté. Puis exécutez java Ladder — pas java Ladder.java. Enlevez la fin .java de la seconde commande. Les deux mêmes commandes fonctionnent sous Windows et sous macOS. Le programme doit afficher trois lignes et s'arrêter : 3, puis 2, puis 1. Il ne doit pas attendre une saisie. Si le terminal attend le clavier, un appel nextLine d'un ancien exercice est encore dans le fichier. Supprimez-le et gardez down(3); plus la méthode down ci-dessus.
Parcourez l'exécution une fois dans l'ordre. Java commence à main. L'appel down(3) entre avec n égal à 3. C'est plus grand que 0, donc la méthode affiche 3, puis appelle down(2). Le deuxième appel affiche 2, puis appelle down(1). Le troisième affiche 1, puis appelle down(0). L'appel avec 0 touche n <= 0 et revient sans afficher. La chaîne se termine. L'écran garde les trois lignes affichées.
Chacun de ces appels est un passage distinct dans le même texte de méthode. Le premier passage a encore du travail après avoir démarré down(2) — finir après le retour de l'appel intérieur. Vous n'écrivez pas quatre noms de méthode différents. Vous écrivez une méthode et laissez l'argument plus petit porter le progrès vers l'arrêt.
Si vous changez le départ en down(2);, l'écran doit montrer 2 puis 1. Le corps de la méthode reste le même ; seul le premier argument change, donc la chaîne est plus courte. Un départ à down(4); doit montrer quatre lignes : 4, 3, 2, 1. Encore une fois le corps ne change pas ; seul main choisit la première valeur.

Placez l'arrêt en premier

L'arrêt doit être vérifié avant l'affichage et avant l'auto-appel. Si vous affichez d'abord et ne testez jamais n, ou si vous appelez toujours down(n) avec la même valeur, le programme ne se termine pas. Gardez le bloc if (n <= 0) en haut de la méthode sur cette forme débutant.

stop checked before print

java
public class Ladder {
    public static void main(String[] args) {
        down(2);
    }

    static void down(int n) {
        if (n <= 0) {
            return;
        }
        System.out.println(n);
        down(n - 1);
    }
}

Compilez et exécutez à nouveau : javac Ladder.java, puis java Ladder. L'écran montre 2 puis 1. L'arrêt termine encore la chaîne quand n atteint 0. Écrire down(n) au lieu de down(n - 1) renvoie le même nombre encore et encore. Alors le programme peut tourner jusqu'à ce que le système l'arrête. L'argument plus petit fait partie de l'idée : chaque appel doit avancer vers l'arrêt.
Voyez l'arrêt comme la porte de sortie. L'affichage est le travail de cette étape. L'auto-appel est l'étape suivante. Sans porte, chaque étape en ouvre une autre sans fin. Si l'étape suivante réutilise le même n, vous ne marchez jamais vers la porte. Les deux erreurs se voient autrement dans le source, mais toutes deux refusent de finir proprement sur cette forme débutant.

Chaîne d'appels à côté de l'écran

Lisez un appel de départ à côté des lignes qu'il produit. Chaque rangée est une visite à down qui affiche encore.

📊 down call chain for down(3)

Appel Valeur de n Ligne à l'écran
premier down(3) 3 3
puis down(2) 2 2
puis down(1) 1 1
puis down(0) 0 (pas de ligne — arrêt)

Une erreur fréquente est d'omettre l'arrêt. Alors chaque appel affiche et rappelle sans fin. Une autre erreur est d'afficher après l'appel récursif au lieu d'avant. Sur cette page l'affichage vient d'abord, donc l'écran compte à rebours. Si vous placez println sous down(n - 1), l'ordre des lignes change — gardez l'affichage au-dessus de l'auto-appel pour le compte à rebours ici.
La portée de la page précédente compte encore un peu : le n de chaque appel est le paramètre de cet appel. Le n de l'appel extérieur ne se réécrit pas quand l'intérieur s'exécute. L'intérieur a un n séparé. Quand l'intérieur revient, l'extérieur continue après l'auto-appel — et sur cette page c'est simplement la fin de la méthode.
Une démo Gate restante avec mark(4) peut rester dans le même fichier et brouiller l'écran si main appelle encore mark. Réduisez main à down(3); ou down(2); pendant que vous apprenez cette page. N'imbriquez pas down dans les accolades de main. Les méthodes sont dans la classe, à côté de main.
Écrire System.out.println("down"); dans main affiche le mot down. Cela ne démarre pas la chaîne. Gardez down(3); quand vous voulez les trois lignes du compte à rebours.

Une autre forme : l'arrêt n'affiche rien

Vous avez vu que l'appel avec 0 revient sans bruit. Vous pouvez aussi vous entraîner avec la valeur de départ 1. L'écran doit montrer une seule ligne : 1. Ensuite le prochain appel est down(0), qui s'arrête.

down starting at one

java
public class Ladder {
    public static void main(String[] args) {
        down(1);
    }

    static void down(int n) {
        if (n <= 0) {
            return;
        }
        System.out.println(n);
        down(n - 1);
    }
}

Après javac Ladder.java et java Ladder, l'écran montre une ligne : 1. Le même corps couvre down(3), down(2) et down(1). Seul le premier argument dans main change. Cela suffit pour cette page débutant. Des idées plus profondes comme renvoyer une somme depuis la récursivité attendent des cours plus tard ; ici le but est l'auto-appel, l'argument plus petit et l'arrêt.
Si l'écran ne montre rien, vérifiez si main appelle encore autre chose, ou si le test d'arrêt est faux — par exemple if (n >= 0) s'arrêterait avant tout affichage avec un n positif. Gardez n <= 0 comme sortie silencieuse, et un départ positif dans main pour qu'au moins une ligne apparaisse.

Avant classes

Vous pouvez écrire down(int n), vous arrêter quand n vaut 0 ou moins, afficher n, puis appeler down(n - 1). Depuis main, un appel démarre toute la chaîne. L'écran montre les lignes du compte à rebours. Une méthode qui n'avance jamais vers l'arrêt ne se termine pas. La page suivante est classes ; vous y commencez à construire des types avec des champs au-delà de ces pages de méthodes static.

🧠 Testez Vos Connaissances

Prêt à Commencer

Testez Vos Connaissances

Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet

❓
5
Questions
🎯
70%
Pour Réussir
♾️
∞
Temps
🔄
∞
Tentatives

📝 Instructions

  • Lisez chaque question attentivement
  • Sélectionnez la meilleure réponse pour chaque question
  • Vous pouvez refaire le quiz autant de fois que vous le souhaitez
  • Votre progression sera affichée en haut