Appel d' une methode recursive , eclaircissement

linoufra Messages postés 3 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 11 mars 2008 - 11 mars 2008 à 18:40
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 - 1 avril 2008 à 15:00
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

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
11 mars 2008 à 19:29
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
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
1 avril 2008 à 15:00
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.
0
Rejoignez-nous