7

一般来说,我对编程很陌生,很难理解这个斐波那契数列示例:

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]

我知道这是不正确的。

4

6 回答 6

7

当你对代码进行推理时,你会从 跳转fib[3] = fib[2] + fib[1]fib[3] = fib[3]. 这碰巧是一个导致正确陈述的转换,但这不是它的工作方式。此代码将 index 处的值添加到 index2处的值1。这与在 index 处取值不同3。这种推理的工作方式如下:

你从fib = [0, 1]. 然后在循环的第一次迭代中你有fib[2] = fib[1] + fib[0]. 这意味着您将 index 处的值0(恰好是0)与 index 处的值(1恰好是 )相加,1以获得放在数组末尾的值 ( 1)。然后在第二次迭代中,您执行类似的操作,将 index 1(still 1) 处的值与 index 2(also 1) 处的值相加得到 get 2,它位于数组的末尾。这将继续,并且在每次迭代中,您将数组中的最后两个值相加以获得下一个值。

在 JavaScript 中,当使用类似 的数组时fibfib[i]指的是i该数组中的第 th 值,从 开始计数0fib[0]数组中的第一个元素也是如此,数组fib[1]中的第二个元素也是如此,依此类推。

于 2012-09-27T23:48:54.800 回答
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
于 2012-09-27T23:58:55.480 回答
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

于 2012-09-27T23:47:42.170 回答
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

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

于 2012-09-27T23:50:44.077 回答
0

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

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

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

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

于 2012-09-28T00:04:41.280 回答
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  );
于 2017-07-24T20:02:24.373 回答