JavaScript中的斐波那契系列

问题描述 投票:5回答:7

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

上面代码的输出是13。我不明白for循环部分。在第一次迭代i = 2,但在第二次迭代i = 3所以a = 2b = 1和第三次迭代i = 4所以a = 3b = 2,等等...如果它正在进行最后的序列将是:[0, 1, 1, 3, 5, 7, 9, 11],这是不正确的。正确的序列将是[0, 1, 1, 2, 3, 5, 8, 13]

javascript fibonacci
7个回答
4
投票

您没有使用已在数组中的前两个数字来>生成要插入到数组中的新fibonacci数。

https://www.mathsisfun.com/numbers/fibonacci-sequence.html

在这里,我使用了result[i-2]result[i-1]的总和来生成新的斐波纳契数并将其推入数组中。

另外要生成n项数,你需要条件为i < n而不是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)); 

如果你想获得第n个学期,请返回result[n-1]


2
投票

我对Fibonacci系列的解决方案:

 const fibonacci = n =>
      [...Array(n)].reduce(
        (acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i),
        []
      )

1
投票

此功能不正确。只需在函数返回之前添加console.log调用即可检查:

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

如您所见,序列是错误的(对于n = 7),返回值也是如此。

可能的变化如下:

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

这是“经典”的斐波纳契数;如果你真的想使用0的第一个数字,而不是1,那么你应该return result[n-1],因为数组索引从零开始。


1
投票

您可以采取的斐波那契序列的一种方法是递归:

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

上面的代码也是dynamic programming方法的一个例子。你可以看到我在第一次用cache方法计算时将每个结果存储在getSequenceNumber对象中。这样,第二次要求getSequenceNumber找到给定的输入,它不需要做任何实际的工作 - 只需从cache获取值并返回它!这是一种可应用于此类函数的优化技术,您可能需要多次查找特定输入的值。


0
投票

你做错了是添加迭代器索引(i),而你需要做的是在该索引的result中添加元素。

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
投票

逻辑有两个问题:

  1. 变量ab目前指的是i - 1i - 2。相反,他们应该参考result数组的元素,即result[i - 1]result[i - 2]
  2. 如果你需要数组的第8个元素,你需要调用result[7]。所以返回的值应该是result[n - 1]而不是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
投票

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
投票

这肯定是那种“清除鸡肉的方式不止一种”的情况之一,下面这个JavaScript方法对我有用。

function fibCalc(n) {
    var myArr = [];

    for (var i = 0; i < n; i++) {
        if(i < 2) {
            myArr.push(i);
        } else {
            myArr.push(myArr[i-2] + myArr[i-1]);
        }
    } 

    return myArr;
}

fibCalc(8);

如上所述,这会产生[0,1,1,2,3,5,8,13]它允许我有一系列基于n的fib数。


0
投票

const fib = n => {
  const array = Array(n);
  for (i = 0; i < array.length; i++) {
    if (i > 1) {
      array[i] = array[i - 1] + array[i - 2];
    } else {
      array[i] = 1;
    }
  }
  return array;
}

console.log(fib(5))
© www.soinside.com 2019 - 2024. All rights reserved.