IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme factorielle recursive


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Points : 31
    Points
    31
    Par défaut Algorithme factorielle recursive
    Bonjour ,

    j ' ai assez galéré pour écrire la méthode récursive permettant le calcul d' une factorielle.
    Cependant je comprends bien l ' empilage (je sais pas si ça se dit) mais j ' ai du mal à comprendre comment se réaliser le désempilage.
    J' ai mis la méthode dans une classe à part .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Utilitaires {
    1-public static long facrec (long n ){
    2-	long resultat ;
    3-	System.out.println ("*** Entree dans factrec : n = " + n );
    4-	if ( n <= 1){
    5-          resultat = 1;
     
    6-      }else {
    7-          System.out.print("n = " + n);
    8-          resultat = facrec (n-1) * n ;
    9-      }
    10-	   System.out.println ("***Sortie de facrec : resultat = " + resultat + " n = "+ n);
     
    11-       return resultat;
     
    12-   }//fin methode
    }
    Procédure main (appel de la méthode)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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));
     
    	}
    }
    Questions :
    1-En fait j ' aimerai bien comprendre le fonctionnement , comment se réalise le désempilement (ou age ).
    2 -en l exécutant , je suis assez étonné de constater que l ' instruction de la ligne 10 est exécutée plusieurs fois , je ne comprends pas comment ceci se produit.

    3-En rentrant un nombre négatif , le résultat est de 1 , je suis assez nul en math mais la factorielle d ' un nombre négatif ce n ' est pas possible

    Merci , j éspère avoir été clair .

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par racoboss Voir le message
    1-En fait j ' aimerai bien comprendre le fonctionnement , comment se réalise le désempilement (ou age ).
    Le cas simple: M1 appelle M2

    Mettons que tu sois dans une méthode M1 et que tu appelles une méthode M2.

    1. Les variables locales de la méthode M1 sont "sauvegardées".
    2. Le pointeur de programme (= le curseur du deboggeur) se déplace au début de la méthode M2 et execute le code de M2 (allocation de variables locales, calculs, ...).
    3. Quand le curseur arrive à la fin de M2:
    3a. les variables locales de M2 sont supprimées
    3b. la valeur de retour est retournée
    3c. les variables locales de M1 sont restaurées
    3d. le pointeur de programme est repositionné dans M1 juste après l'appel à M2.

    Le cas récursif: M1 appelle M1

    Idem que le cas précédent, sauf que M2=M1

    1. Les variables locales de la méthode M1 sont "sauvegardées".
    2. Le pointeur de programme se déplace au début de la méthode M1 et execute le code de M1 (allocation de variables locales, calculs, ...)
    3. Quand le curseur arrive à la fin de M1:
    3a. les variables locales de M1 sont supprimées
    3b. la valeur de retour est retournée
    3c. les "anciennes" variables locales de M1 sont restaurées
    3d. le pointeur de programme est repositionné dans M1 juste après l'appel à M1.

    2 -en l exécutant , je suis assez étonné de constater que l ' instruction de la ligne 10 est exécutée plusieurs fois , je ne comprends pas comment ceci se produit.
    C'est normal. A chaque appel de "facrec()", que tu passe dans le "if" ou le "else", tu passeras forcément à la fin par la ligne 10.

    3-En rentrant un nombre négatif , le résultat est de 1 , je suis assez nul en math mais la factorielle d ' un nombre négatif ce n ' est pas possible
    Il suffit d'ajouter un "if" supplémentaire au début de "facrec()" pour gérer ce cas.

Discussions similaires

  1. Algorithmes pour calculer la factorielle
    Par TrexXx dans le forum Mathématiques
    Réponses: 14
    Dernier message: 22/01/2009, 23h32
  2. [Algorithme] genre factorielle ?
    Par Ticoche dans le forum C#
    Réponses: 25
    Dernier message: 13/05/2008, 07h14
  3. Algorithme, recursion de répertoire.
    Par SPKlls dans le forum Langage
    Réponses: 0
    Dernier message: 24/02/2008, 20h35
  4. Algorithme de recursion (un peu rouillée)
    Par zuzuu dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 14/11/2007, 15h19
  5. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo