Javascript中的斐波纳契数列

时间:2012-09-27 23:42:42

标签: javascript fibonacci

我对编程很新,并且很难理解这个Fibonacci序列的例子:

var fib = [0, 1];
for (var i = 2; i < n; i++) {
    fib[ i ] = fib[ i - 1 ] + fib[ i - 2 ];
    console.log(fib);
}

在第一次迭代中,索引2等于1,足够简单。但是,当我尝试i = 3的第二次迭代时,我得到:

fib[ 3 ] = fib[ 3 - 1 ] + fib[ 3 - 2 ];  
fib[ 3 ] = fib[ 2 ] + fib[ 1 ]; 
fib[ 3 ] = fib[ 3 ];

我的思维在哪里出错了?到目前为止,我有:

var fib = [0,1,1,3]

我知道这是不正确的。

6 个答案:

答案 0 :(得分:7)

当您推断代码时,您可以从fib[3] = fib[2] + fib[1]跳转到fib[3] = fib[3]。这恰好是一个导致正确语句的转换,但它不是如何工作的。此代码将索引2的值添加到索引1的值。这与在索引3处获取值不同。这种推理应该起作用的方式如下:

您从fib = [0, 1]开始。然后在循环的第一次迭代中,您有fib[2] = fib[1] + fib[0]。这意味着您将索引0(恰好是0)的值添加到索引1的值(恰好是1)以获取值你放在数组的末尾(1)。然后在第二次迭代中,你做了类似的事情,将索引1(仍为1)的值添加到索引2(也是1)的值以获取2,它位于数组的末尾。这将继续,并在每次迭代时将数组中的最后两个值相加,以获得下一个值。

在JavaScript中,当使用fib之类的数组时,fib[i]引用此数组中的i值,从0开始计算。所以fib[0]是数组中的第一个元素,fib[1]是数组中的第二个元素,依此类推。

答案 1 :(得分:2)

fib[ 3 ] = fib[ 3 - 1 ] + fib[ 3 - 2 ];  
fib[ 3 ] = fib[ 2 ] + fib[ 1 ]; 
fib[ 3 ] = fib[ 3 ];

您正在添加索引而不是索引指向

的数组中的值
fib[ 3 ] = fib[ 3 - 1 ] + fib[ 3 - 2 ];  
fib[ 3 ] = fib[ 2 ] + fib[ 1 ]; 
fib[ 3 ] = 1 + 1;

[0,1,1,2]

fib[0] = 0
fib[1] = 1
fib[2] = 1
fib[3] will equal 2

所以下一次迭代

fib[4] = fib[4-1] +fib[4-2]
fib[4] = fib[3] + fib[2]
fib[4] = 1 + 2
fib[4] = 3

答案 2 :(得分:1)

你的代码很好。跑了这个并得到了正确的输出:

var fib = [0, 1];
for (var i = 2; i < 10; i++) {
    fib[ i ] = fib[ i - 1 ] + fib[ i - 2 ];
    console.log(fib);
}

控制台:0,1,1,2,3,5,8,13,21,34

答案 3 :(得分:0)

fib[ 3 ] = fib[ 3 - 1 ] + fib[ 3 - 2 ];  
fib[ 3 ] = fib[ 2 ] + fib[ 1 ]; 
fib[ 3 ] = fib[ 3 ];

所以你的问题就在第2行。 []括号中的数字是索引,它指出应该读取数组的哪一部分。当应用+运算符时,它们不会被添加,而是会将两个fib[2]fib[1]计算为相应的数据,这意味着它们会被评估为11 ,然后将它们加在一起2

我希望这是可以理解的。如果没有,请在评论中提问。

答案 4 :(得分:0)

好吧,你为什么要在计算中这样做

fib[3] = fib[2] + fib[1]
fib[3] = fib[3]

当您处理数组时,索引之和所代表的索引处的值不等于这些索引处数组值的总和。

简单地说,你不能在方括号中添加数字在纸上。它有两个钱包,每个钱包5美元和15美元。你不能说你有15美元,因为1 + 1是两个,你会看到第二个钱包。您将添加钱包的“内容”,而不是查找总金额。这是20

答案 5 :(得分:0)

使用 array reduce()

实施
var a = [3,2,3,6,2,3,4];
var fib  = a.reduce(function(sum, v, i) {
    return i === 0 ? sum.concat(v) : sum.concat(v + sum[i-1]);
},[]);
console.log( fib  );

<强> ES6:

var fibES6 = a.reduce(
    (sum, v, i) => i === 0 ? sum.concat(v) : sum.concat(v + sum[i-1])
, []);
console.log( fibES6  );