我正在做欧拉项目问题2,其中目标是对具有小于4百万的值的斐波纳契序列的偶数求和。我搜索了一下,我已经看到了几个使用while循环的解决方案,但没有简单的使用for循环。我很好奇为什么我用以下代码返回零:
var array = [];
array[0] = 0;
array[1] = 1;
var total = 0;
for(var i=2;total<=4000000;i++) {
array[i] = array[i-1] + array[i-2];};
for(var x=0;x<array.length;x++){
if(array[x]%2 === 0){
total += array[x]};};
alert(total);
我猜这个问题是在我的for循环中使用total变量。我无法使用array [i]&lt; = 4000000来工作,我真的很好奇这背后的原因。有谁知道这是为什么?我可以在for循环条件(第二个语句)中更改以获得正确的总数吗?
答案 0 :(得分:1)
我为你修好了。
var i, data = [ 0, 1 ], total = 0;
for (i = 2; i <= 4000000; i++)
{
data[i] = data[i - 1] + data[i - 2];
if (data[i] % 2 === 0)
{
total += data[i];
}
}
alert(total);
我不确定你的终止条件是什么样的,你说的值小于4百万,但这是不明确的。也许它应该是total <= 4000000
或data[i] <= 4000000
。你的措辞不够准确。
答案 1 :(得分:1)
首先,for
首先存在无限循环。您的病情必须是array[i-1] < 4000000
。之后,你的第二个for循环将找到正确的结果。
同样针对这个问题,您不需要存储所有斐波那契数字,然后找到偶数的总和。 你可以在计算斐波纳契时计算总和。
var first = 0;
var second = 1;
var sum = 0;
for(var current=first+second; current < 4000000; current = first+second){
if(current%2 === 0){
sum+=current;
}
first = second;
second = current;
}
答案 2 :(得分:0)
很抱歉,但对我来说,你的代码会陷入死循环。首先“for”使用总数作为检查,但它永远不会增加。如果你想这是一个基于dinamic编程和memoization tecnic的fibonacci序列的解决方案。
var f1 = 1;
var f2 = 1;
for(var i = 2; i < 40000; i++){
console.info(i, f1, f2);
var temp = f1 + f2;
f1 = f2;
f2 = temp;
}
alert(f2);