Partage
  • Partager sur Facebook
  • Partager sur Twitter

la suite de tonton fibo et le stack error

Sujet résolu
    21 juillet 2017 à 19:48:19

    Bonjour pour m'amuser j'ai voulue faire un script genre suite de Fibonacci, seulement il me sort une erreur :

    "Uncaught RangeError: Maximum call stack size exceeded"

    et j'arrive pas à trouver d'ou ça viens! Merci de votre aide =)) 

        function fibo (num) {
    
                if (num == 1) {
                    return 1;
                }
    
                var a = num-1;
                var b = num-2;
    
                return fibo(a)+fibo(b);
            }
    
        for (var nbDepart = 0; nbDepart < 10; nbDepart++) {
            console.log(fibo(nbDepart));
        }



    • Partager sur Facebook
    • Partager sur Twitter
    My Website - 
      21 juillet 2017 à 20:13:14

      Bonjour,

      Ben ta fonction se rappelle elle même en boucle, tout simplement.

      • Partager sur Facebook
      • Partager sur Twitter
        21 juillet 2017 à 20:17:56

        Salut,

        Ton problème survient quand tu arrives à fibo(2), qui va te forcer à calculer fibo(0), va éviter ta condition num == 1 et continuer dans les nombres négatifs indéfiniment (enfin jusqu'à atteindre le sommet de la pile de récursions autorisée)

        Par contre je ne suis pas d'accord : c'est fifi

        Pitox, la récursion est volontaire ici. Ce qui déconne c'est qu'à un moment elle devrait s'arrêter.

        -
        Edité par tabouretBleu 21 juillet 2017 à 20:20:25

        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2017 à 20:40:35

          Bonjour,

          Tu pourrais aussi très bien utiliser un générateur et utiliser une logique itérative pour générer ta suite.

          "use strict";
          
          const fibonacci = function*(limit = 0) {
            let first = 0;
            let second = 1;
            for (let current = 0; current < limit; current++) {
              yield first;
              [first, second] = [second, first + second];
            }
          };
          
          for (let iteration of fibonacci(10)) {
            console.log(`Current fibonacci iteration: ${iteration}`);
          }
          
          /*
          
          Current fibonacci iteration: 0
          Current fibonacci iteration: 1
          Current fibonacci iteration: 1
          Current fibonacci iteration: 2
          Current fibonacci iteration: 3
          Current fibonacci iteration: 5
          Current fibonacci iteration: 8
          Current fibonacci iteration: 13
          Current fibonacci iteration: 21
          Current fibonacci iteration: 34
          
          */

          Démo JSFiddle.

          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2017 à 23:57:16

            Il est tout à fait possible d'utiliser des fonctions récurrentes. Encore convient-il de comprendre ce que l'on fait !
            (num-1 n'a aucun rapport avec le valeur de la fonction pour num-1)

            <script>
            function fbn(n){var r;
            	if (n<3) r=1;
            	else r=fbn(n-1)+fbn(n-2);
            	return r;
            }
            for (i=1;i<20;i++) console.log(i+"=>"+fbn(i));
            
            </script>

            Bien entendu, le script n'est pas très efficace pour les grandes valeurs. Il serait plus astucieux de stocker les valeurs dans un tableau pour celles-ci.

            Sinon les stack errors overflow proviennent de la pile. Chaque appel de fonction se traduit en mémoire par un empilement de la valeur de l'argument et de la définition de la fonction. Cet empilement ne disparaissant que lors de la sortie de la fonction (pour être remplacé par la valeur retournée). Dans le cas présent il atteint des dimensions considérables avec ces doubles appels qui se multiplient   

            -
            Edité par 007julien 22 juillet 2017 à 0:03:37

            • Partager sur Facebook
            • Partager sur Twitter
              22 juillet 2017 à 0:00:36

              Ok je viens de réaliser mon erreur :magicien: en faite il faut que je fasse : 
              if (num <= 1)
              

              et non 

              if (num == 1) 

              Ce qui donne donc : 

              function fibo (num) {
               
                      if (num <= 1) {
                          return 1;
                      }
               
                      var a = num-1;
                      var b = num-2;
               
                      return fibo(a)+fibo(b);
                  }
               
              for (var nbDepart = 0; nbDepart < 10; nbDepart++) {
                  console.log(fibo(nbDepart));
              }
              
              /*
              1
              1
              2
              3
              5
              8
              13
              21
              34
              55
              */

              Pour ce qui est des générateurs je pense que j'ai pas le lvl encore haha ^^ je fait d'abord voir pour finir le cour et ensuite me plonger dedans! Merci de vos réponse en tous cas! 

              007julien a écrit:

              (num-1 n'a aucun rapport avec le valeur de la fonction pour num-1)

              007julien je comprend pas. Le code que tu donne est pratiquement identique au miens en terme de fonctionnement en plus :euh:



              -
              Edité par HadockB 22 juillet 2017 à 0:06:22

              • Partager sur Facebook
              • Partager sur Twitter
              My Website - 
                22 juillet 2017 à 0:47:47

                Je ne suis pas très bon en maths mais je crois me souvenir qu'il y a une formule pour connaître la valeur de n'importe qu'elle étape d'une suite sans avoir à calculer tous les membres. Seulement, ça fonctionne sans doute pour des suites "régulières" et je ne sais pas si la suite de fifi rentre dans ce cadre.

                J'aurais tellement aimé savoir programmer en première et en terminale... tous ces trucs auraient été plus concrets et ça serait resté.

                • Partager sur Facebook
                • Partager sur Twitter
                  22 juillet 2017 à 10:40:02

                  C'est vrais que, bizarrement, je trouve ça plus "amusant" de faire des maths avec du code que juste des maths haha ^^

                  Sinon ya ça qui pourrais peux-être te servir : 

                  C'est pas mal je trouve (perso j'ai pas fait un cursus "s" donc ça me sert bien!)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  My Website - 
                    22 juillet 2017 à 22:46:33

                    Effectivement, j'avais mal lu. Les variables a et b sont cependant totalement inutiles, ce qui n'est pas gratuit car elles accroissent la taille de la pile  

                    -
                    Edité par 007julien 22 juillet 2017 à 22:46:47

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 juillet 2017 à 23:48:48

                      007julien a écrit:

                      Effectivement, j'avais mal lu. Les variables a et b sont cependant totalement inutiles, ce qui n'est pas gratuit car elles accroissent la taille de la pile  


                      Ok merci de l'info ^^ du coup : 

                      return fibo(n-1)+fibo(n-2);



                      • Partager sur Facebook
                      • Partager sur Twitter
                      My Website - 
                        23 juillet 2017 à 9:07:11

                        tabouretBleu a écrit:

                        Je ne suis pas très bon en maths mais je crois me souvenir qu'il y a une formule pour connaître la valeur de n'importe qu'elle étape d'une suite sans avoir à calculer tous les membres. Seulement, ça fonctionne sans doute pour des suites "régulières" et je ne sais pas si la suite de fifi rentre dans ce cadre.

                        J'aurais tellement aimé savoir programmer en première et en terminale... tous ces trucs auraient été plus concrets et ça serait resté.


                        Il me semble avoir vu sur un fil de discussion Stackoverflow le nom d'un certain Binet pour calculer l'itération de la suite de Fibonacci à l'index N. En cherchant un peu j'ai trouvé ça sur Wikipedia. A voir si ça peut aider dans la construction d'une structure conditionnelle...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 juillet 2017 à 12:18:25

                          Du coup solution trouver avec Mr.Binet :magicien: cette méthode est vraiment pas mal j'ai put calculer les 1000 premier sans planter mon navigateur :p 

                          for (i=50;i<51; i++) { //f50 = 12586269024.999998
                          
                                      var phi = ((1+ Math.sqrt(5)) / 2), //donne phi (le nb d'or) (1 + racine de 5) diviser par 2
                                              n = ((Math.pow(phi, i))/(Math.sqrt(5))); //donne le nb de fibo -> (phi exposant n) diviser par la (racine de 5)
                          
                                      console.log(n);
                              }
                          
                              /*
                              Resultat pour les 10 premiers (i=0; i<10; i++)
                          
                               0.4472135954999579
                               0.7236067977499789
                               1.1708203932499368
                               1.8944271909999157
                               3.0652475842498528
                               4.959674775249769
                               8.024922359499621
                               12.984597134749391
                               21.00951949424901
                               33.9941166289984
                               */



                          -
                          Edité par HadockB 23 juillet 2017 à 12:22:21

                          • Partager sur Facebook
                          • Partager sur Twitter
                          My Website - 
                            23 juillet 2017 à 19:44:33

                            C'est à prendre avec des pincettes puisque apparemment (toujours d'après Wikipedia, mais à vérifier donc) l'index limite (à partir duquel les valeurs commence à perdre de leur fiabilité) commencerait à 71.

                            Par contre je pense qu'il faudra arrondir pour obtenir la bonne séquence à N. Mais je peux me tromper (je ne suis pas non plus une lumière en maths).

                            -
                            Edité par Walter O'Brien 23 juillet 2017 à 19:47:43

                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 juillet 2017 à 21:03:05

                              Effectivement j'ai lu la même chose :) en tout cas merci pour la discutions à tous :magicien:
                              • Partager sur Facebook
                              • Partager sur Twitter
                              My Website - 

                              la suite de tonton fibo et le stack error

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown