Appel d' une methode recursive , eclaircissement

Signaler
Messages postés
3
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
11 mars 2008
-
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
-
Bonjour ,
j aimerait comprendre comment fonctionne l ' appel de la méthode recursive suivante :

//main appel de la méthode
public class TestFacrec2 {
    public static void main (String [] args){
        int nombre;
        System.out.print( " Saisir un nombre entier positif ou nul  :  ");
        nombre = Lire.entierInt();
        System.out.print( " Sa factorielle est : " + Utilitaires.facrec(nombre));
    }

}

class Utilitaires {

    public static long facrec (long n ){
        long resultat ;
        System.out.println ("*** Entree dans factrec : n = " + n );
        if ( n <= 1){
            resultat = 1;
            //System.out.println("resultat dans if " + resultat);
        }else {
            resultat = facrec (n-1) * n ;
            //System.out.println("resultat dans else " + resultat);
        }
        System.out.println ("***Sortie de facrec : resultat = " + resultat );
        return resultat;
         }
}

Resultat execution  :

 Saisir un nombre entier positif ou nul  :  5
*** Entree dans factrec : n = 5
*** Entree dans factrec : n = 4
*** Entree dans factrec : n = 3
*** Entree dans factrec : n = 2
*** Entree dans factrec : n = 1
***Sortie de facrec : resultat = 1
***Sortie de facrec : resultat = 2
***Sortie de facrec : resultat = 6
***Sortie de facrec : resultat = 24
***Sortie de facrec : resultat = 120
 Sa factorielle est : 120

Problèmes :
Je ne comprends pas comment ceci fonctionne , on est bien obligé de tester la condition et de rentrer dans le if ?je ne sortirais du if que lorsque n sera inferieur ou égal a 1?
Je m attendais pas a autant de sortie , mais a une unique sortie du type :
***Sortie de facrec : resultat = 120

en fait je suis un peu noyé , si on peut m eclaircir sur les points obscurs , je sais que je ne suis pas tres clair , j ' aimerai bien qu ' on m explique le cheminement.

merci

2 réponses

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
125
Salut,

c'est de l'algorithmique pur : ta fonction est appelée récursivement 5 fois, avec à chaque fois le paramètre décrémenté de 1.
Puis une fois que ton paramètre vaut 1, il sort des 5 appels de fonctions, en multipliant le rsultat... d'où ses sorties console qui sont tout à fait logiques !

La récursion c'est pratique, mais ca rend un code moins lisible, et très souvent, beaucoup moins optimisé : ici tu as 5 appels de fonctions, alors que tu aurais très facilement pu le faire dans une simple boucle.
______________________________________
DarK Sidious
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
25
Salut,

En effet, la version récursive est moins rapide que la version itérative. Mais c'est une façon de penser bien utile une fois qu'elle est acquise car dans certains cas (exemple : les compilateurs), elle est bien plus lisible et facile à programmer. Il y a cependant un autre problème, c'est la mémoire que ça prend. En java, il y a une pile qui stocke les appels de fonctions et qui peut déborder. Personnelement, je fais toutes mes IA avec la récursivité, (le compte est bon, sudoku, échecs, dames, ...) et je n'ai pas eu de problèmes de débordement de cette pile.