Le factorielle avec netbeans

Résolu
cc tout le monde svp si quelqu'un peut m'aider de savoir c quoi le pb de mon pgm je l'ai programmé en java en utilisons netbeans sur 1 factorielle d'un nombre donné lors de son execution il m'affiche le msg suivant Exception in thread "main" java.lang.StackOverflowError
at factoriel.factoriel(factoriel.java:6)

voici le pgm que j ai fait :

import java.util.*;
public class factoriel {

  public  static int factoriel (int x) {

       return x* factoriel(x-1);
       }


public static void main (String []args){
    System.out.println("donner la valeur de x :");
     Scanner d=new Scanner(System.in);
    int  x= d.nextInt();
    int z = factoriel(x);
    System.out.println("la valeur du factorielle du x est:" +z);
  }
}

et merci d'avance;

2 réponses

  1. Modérateur
    Bonjour,

    Le problème c'est que tu ne t'arrêtes jamais.

    Dans factoriel(x) tu appelles factoriel(x-1), qui appelle x-2, puis x-3 etc.
    Si tu avais fait une boucle (for ou while) ton programme ne s'arrêterait jamais, mais ici puisque tu fais des appels récursifs il y a une pile d'appels qui s'accumule, jusqu'à ce qu'elle soit pleine (sa taille doit être de 1024) et là ça provoque une StackOverflowError.
    1. merci pour ton aide,mais vrm je sais pas comment le regler,si vous avez une solution proposé là svp,merci
    2. Modérateur
      Tu peux faire mentalement le calcul pour voir ce qui coince, par exemple 3 au départ :

      factoriel(3) = 3 * factoriel(2)

      Il faut donc calculer factoriel(2) avant de pouvoir faire le produit :

      factoriel(2) = 2 * factoriel(1)
      factoriel(1) = 1 * factoriel(0)
      factoriel(0) = 0 * factoriel(-1)
      factoriel(-1) = -1 * factoriel(-2)
      etc.

      Il faut que tu rajoutes de la connaissance à ton algorithme, pour l'instant il n'y a que des règles de passage d'un cas à un autre, mais il n'y a aucune valeur qui permet de débloquer le calcul. Du coup Java continue bêtement...
  2. Bonjour essaye un peu ceci juste pour continuer dans ta logique
    public  static int factoriel (int x) {
    if (x>=1){
    return x* factoriel(x-1);
    }
    else{return x+1;}
    }
    1. cc ,merci enrm ,enfin a marché et en + aujourd'hui je les montré à 1e prof de java elle m a dit que ya pas de fonction(methode) réciproque ds netbeans,merci.