2014-08-29 47 views
0

我在做Euler項目問題​​2,其中的目標是總結價值低於400萬斐波那契序列的偶數。我搜索了一下,我已經看到幾個使用while循環的解決方案,但使用for循環並沒有什麼簡單的。我很好奇爲什麼我回到零與下面的代碼:Javascript歐拉斐波那契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); 

我猜測問題是在我的循環使用總變量。我無法使用array [i] < = 4000000來工作,我真的很好奇這裏的原因。任何人都知道這是爲什麼?我可以在for循環條件(第二條語句)中更改哪些內容以獲得正確的總數?

+0

這甚至不終止。第一個for()會掛起,因爲條件total = 4000000將始終爲真。 – pid 2014-08-29 07:39:00

+0

是的,循環沒有終止。將第二個循環嵌入第一個循環中。 – 2014-08-30 09:36:56

回答

1

首先首先有一個無限循環for。您的條件必須是array[i-1] < 4000000。之後,你的第二個循環將找到正確的結果。

此外,對於這個問題,你不需要存儲所有斐波那契數字,然後找到偶數的總和。 計算斐波那契時可以計算總和。

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; 
} 
+0

它是一個無限循環,因爲數組[2] <4000000(將要運行的第一個循環)使用數組[2]中尚未創建或還有其他原因的條目?同時感謝您向我展示計算方法。我早些時候嘗試過,但無法弄清楚如何短語for循環的第三個條件。 – 2014-08-29 19:09:54

+0

在你的問題中,總數<4000000,並且在循環體中沒有操作來改變總數,因此總數將總是0並且循環將永遠運行。 – 2014-08-29 19:19:41

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

我不知道你終止條件應該是什麼樣的,你說的有不到400萬的值,但是這是不明確的。也許它應該是total <= 4000000data[i] <= 4000000。你的措辭不夠精確。

0

對不起,但對我來說你的代碼進入死循環。第一個「爲」使用總數作爲檢查,但它從來沒有增加。如果你想這是一個解決fibonacci序列基於dinamic編程memoization tecnic。

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

你的情況是無效的,因爲問題要求fibonacci序列的值小於4000000,你的序列是4000000。 'f0'也是'0'。 – 2014-08-29 08:52:25