1
 var num = [1,1];
 var total = 0;
 var i = num.length;
 do {
    i++;
    num[i] = num[num.length-1] + num[num.length-2];
    total+=num[i];
    console.log(total);
 }
 while(num[num.length] < 4000000);

我已经研究了一两天的 Project Euler 问题,希望能扩展我的知识和实用性。在第二个问题上,我一直在想出一种(不好的)方法来获得斐波那契数列。但是,我的代码将打印“2”到控制台,因为它应该但随后停止。我遇到的另一个问题是,仅使用“while(X IS TRUE/FALSE) { DO STUFF }”是行不通的。不知道为什么。

我可能只是在犯愚蠢的错误,但有人请赐教:)

4

2 回答 2

3

num.length将始终比 的最后一个索引大 1 num,即如果num.length为 5,num则索引为 0 到 4,num[5]则不存在。

最高可用索引将在您的情况下num.length - 1尝试num[num.length - 1]

于 2012-10-10T15:43:25.520 回答
2

您的num数组有 2 个元素,因此num.length(也i)是 2。do块中的第一条语句是i++. 现在i是3。

你正在设置num[3],这意味着num现在[1, 1, undefined, 1]

此外,在您的while, 您正在检查num[num.length]. 由于数组是零索引的,所以这永远不会起作用,就像num.length现在 4 一样。

我的建议是:i设置元素后递增。因此,您推送一个新元素,然后增加长度计数器。

var num = [1, 1],
    total = 0,
    i = 2;  // we already know the length, no need to get it
do {
    // we don't need the i++ here
    num[i] = num[i - 1] + num[i - 2]; // add the last 2 elements to the end
    total += num[i];
    console.log(total);
}
while (num[i++] < 4000000);  // "i++" increments i and returns its old value
于 2012-10-10T15:49:39.543 回答