function fib(n) {
const result = [0, 1];
for (var i = 2; i <= n; i++) {
const a = (i - 1);
const b = (i - 2);
result.Push(a + b);
}
return result[n];
}
console.log(fib(8));
La sortie du code ci-dessus est 13
. Je ne comprends pas la partie boucle. Dans la toute première itération i = 2
, mais après la deuxième itération i = 3
so a = 2
et b = 1
et la troisième itération i = 4
so a = 3
, b = 2
et ainsi de suite ... Si la séquence finale est en cours, elle sera: [0, 1, 1, 3, 5, 7, 9, 11]
, ce qui est incorrect. La séquence correcte sera [0, 1, 1, 2, 3, 5, 8, 13]
Vous n'utilisiez pas les deux nombres précédents déjà présents dans le tableau pour générer le nouveau numéro de fibonacci à insérer dans le tableau.
https://www.mathsisfun.com/numbers/fibonacci-sequence.html
Ici, j'ai utilisé la somme de result[i-2]
et result[i-1]
pour générer le nouveau numéro de fibonacci et l'a poussé dans le tableau.
De plus, pour générer n
nombre de termes, vous devez que la condition soit i < n
et non i <= n
.
function fib(n) {
const result = [0, 1];
for (var i = 2; i < n; i++) {
result.Push(result[i-2] + result[i-1]);
}
return result; // or result[n-1] if you want to get the nth term
}
console.log(fib(8));
Renvoyez result[n-1]
si vous voulez obtenir le nième terme.
Une approche que vous pouvez adopter pour la séquence fibonacci est la récursivité:
var fibonacci = {
getSequenceNumber: function(n) {
//base case to end recursive calls
if (n === 0 || n === 1) {
return this.cache[n];
}
//if we already have it in the cache, use it
if (this.cache[n]) {
return this.cache[n];
}
//calculate and store in the cache for future use
else {
//since the function calls itself it's called 'recursive'
this.cache[n] = this.getSequenceNumber(n - 2) + this.getSequenceNumber(n - 1);
}
return this.cache[n];
},
cache: {
0: 0,
1: 1
}
}
//find the 7th number in the fibbonacci function
console.log(fibonacci.getSequenceNumber(7));
//see all the values we cached (preventing extra work)
console.log(fibonacci.cache);
//if you want to output the entire sequence as an array:
console.log(Object.values(fibonacci.cache));
Le code ci-dessus est également un exemple de programmation dynamique . Vous pouvez voir que je stocke chaque résultat dans un objet cache
la première fois qu'il est calculé par la méthode getSequenceNumber
. Ainsi, la deuxième fois que getSequenceNumber
est demandé pour trouver une entrée donnée, il n’a pas à effectuer de travail réel. Il suffit de saisir la valeur de cache
et de la renvoyer! Il s'agit d'une technique d'optimisation qui peut être appliquée à des fonctions telles que celle-ci, où vous devrez peut-être rechercher la valeur d'une entrée particulière plusieurs fois.
Cette fonction est incorrecte. Cela peut être vérifié en ajoutant simplement l'appel console.log
juste avant le retour de la fonction:
function fib(n) {
const result = [0, 1];
for (var i = 2; i <= n; i++) {
const a = (i - 1);
const b = (i - 2);
result.Push(a + b);
}
console.log(result);
return result[n];
}
console.log(fib(7));
Comme vous pouvez le constater, la séquence est incorrecte et (pour n = 7
) la valeur de retour l'est aussi.
Le changement possible serait comme suit:
function fib(n) {
const result = [0, 1];
for (var i = 2; i <= n; i++) {
const a = result[i - 1];
const b = result[i - 2];
result.Push(a + b);
}
console.log(result);
return result[n];
}
console.log(fib(8));
Ce sont les nombres "classiques" de Fibonacci; si vous voulez vraiment utiliser le premier nombre de 0
, pas 1
, vous devriez alors return result[n-1]
, car les index de tableau commencent à zéro.
solution simple pour la série de Fibonacci:
function fib(n){
var arr = [];
for(var i = 0; i <n; i++ ){
if(i == 0 || i == 1){
arr.Push(i);
} else {
var a = arr[i - 1];
var b = arr[i - 2];
arr.Push(a + b);
}
}
return arr
}
console.log(fib(8))
Ce que vous faites mal, c'est d'ajouter l'index d'itérateur (i), alors que vous devez ajouter l'élément de la variable result
à cet index.
function fib(n) {
const result = [0, 1];
for (let i = 2; i <= n; i++) {
const a = result[(i - 1)];
const b = result[(i - 2)];
result.Push(a + b);
}
console.log("Result Array: " + result);
return result[n];
}
console.log("Fibonacci Series element at 8: " + fib(8));
Il y a deux problèmes avec la logique:
Les variables a
et b
font actuellement référence à i - 1
et i - 2
. Au lieu de cela, ils doivent faire référence aux éléments du tableau result
, à savoir result[i - 1]
et result[i - 2]
.
Si vous avez besoin du 8ème élément du tableau, vous devez appeler result[7]
. La valeur renvoyée doit donc être result[n - 1]
au lieu de result[n]
.
function fib(n) {
const result = [0, 1];
for (var i = 2; i < n; i++) {
const a = result[i - 1];
const b = result[i - 2];
result.Push(a + b);
}
console.log(result);
return result[n - 1];
}
console.log(fib(8));