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

avec Java Discussion :

Problème: factoriel récursif


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Problème: factoriel récursif
    Bonjour à tous!

    J'ai un petit problème avec ce bout de code qui calcule les factoriels de 1! à 25!. En effet, 21! affiche un résultat négatif. Je ne comprend pas pourquoi

    Voici le bout de code que j'utilise :

    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
    18
    public class Factorial 
    { 
      // Evaluate n! 
      public static long factorial(int n) 
      { 
        if (n <= 1)     // base case 
          return 1; 
        else 
          return n * factorial(n - 1); 
      } 
     
      // Simple test program 
      public static void main(String [] args) 
      { 
        for (int i = 1; i <= 25; i++) 
          System.out.println(i + "! = " + factorial(i)); 
      } 
    }


    Voici l'affichage:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    1! = 1
    2! = 2
    3! = 6
    4! = 24
    5! = 120
    6! = 720
    7! = 5040
    8! = 40320
    9! = 362880
    10! = 3628800
    11! = 39916800
    12! = 479001600
    13! = 6227020800
    14! = 87178291200
    15! = 1307674368000
    16! = 20922789888000
    17! = 355687428096000
    18! = 6402373705728000
    19! = 121645100408832000
    20! = 2432902008176640000
    21! = -4249290049419214848
    22! = -1250660718674968576
    23! = 8128291617894825984
    24! = -7835185981329244160
    25! = 7034535277573963776
    Merci pour votre aide, ou pour vos suggestions!

    Loader

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Normal, il y a un dépassement de capacité du type int (qui est grosso modo de taille 2^31 dans les positif). Donc ça repart dans les négatifs.

    Si tu veux vraiment calculer les factoriels jusqu'à de grande taille (ce qui n'est en général pas vraiment utile...), il faut utiliser la classe BigInteger.
    Je ne répondrai à aucune question technique en privé

  3. #3
    Provisoirement toléré
    Homme Profil pro
    Développeur JAVA JEE / PHP
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur JAVA JEE / PHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Points : 72
    Points
    72
    Par défaut
    vous pouvez changer le type int avec les biginterger de java

    Citation Envoyé par empire.dev Voir le message
    vous pouvez changer le type int avec les biginterger de java
    http://java.sun.com/j2se/1.4.2/docs/...igInteger.html

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Citation Envoyé par millie Voir le message
    Normal, il y a un dépassement de capacité du type int (qui est grosso modo de taille 2^31 dans les positif). Donc ça repart dans les négatifs.
    C'est ca sauf que la c'est un dépassement de capacité du long donc la valeur maximal dans les positif est 2^63 - 1 soit tout de même plus de 9e18. Tu vas vite mettre ton pc a genou si tu pars loin dans les factoriels...
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Frifron Voir le message
    C'est ca sauf que la c'est un dépassement de capacité du long donc la valeur maximal dans les positif est 2^63 - 1 soit tout de même plus de 9e18. Tu vas vite mettre ton pc a genou si tu pars loin dans les factoriels...
    Non, c'est bien un int qui est utilisé.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    non c'est un dépassement du long et non d'int. L'overflow se fait sur 64 bits et non 32. Avec un entier signé sur 32 bits , tu peux aller jusqu'a 2^31 - 1 soit 2 milliards et des poussieres. Tu peux calculer sans dépassement un factoriel jusqu'a 12. avec un entier signé sur 64 bits, tu peux aller jusqu'a 20

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return n * factorial(n - 1);
    (long) = (int) * (long)

    l'opération est sur 64 bits
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Désolé, j'avais regardé le paramètre sans faire attention au type de sortie de la méthode
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. [XSLT 1.0] Problème template récursif
    Par scary dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 18/02/2011, 12h48
  2. Factoriel récursif
    Par hpalpha dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/02/2011, 17h24
  3. [Tableaux] Problème algo récursif
    Par Invité dans le forum Langage
    Réponses: 38
    Dernier message: 03/10/2006, 15h49
  4. problème des N reines récursif
    Par duvi dans le forum C++
    Réponses: 7
    Dernier message: 20/02/2006, 13h45
  5. problème algorithme récursif
    Par seb888 dans le forum Général Java
    Réponses: 11
    Dernier message: 04/06/2005, 21h35

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