web-dev-qa-db-fra.com

Série Fibonacci en JavaScript

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]

3
sumon

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.

2
Saif Ur Rahman

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.

1
Tom O.

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.

1
Cerberus

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))
0
patki

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));

0
Abhishek Soni

Il y a deux problèmes avec la logique:

  1. 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].

  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));

0
Nisarg