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));
}
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
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
*/
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
Ok je viens de réaliser mon erreur 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
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é.
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
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
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...
Du coup solution trouver avec Mr.Binet cette méthode est vraiment pas mal j'ai put calculer les 1000 premier sans planter mon navigateur
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
*/
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
× 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.