[英]Loop for, condition 2, doesn't comply
我是一名JavaScript知識有限的學生(第一年),需要有關Euler項目#2的幫助。
var arr = [1, 2]; var total = 2; var x = 0; var y = 1; for (var i; total < 4000000; x++, y++) { i = arr[x] + arr[y]; arr.push(i); if (i % 2 == 0) { total += i } } console.log(total);
當總數小於4,000,000時,我的循環應該停止,但是由於某種原因,總數為4,613,732。
您的代碼“沒有”做任何不尋常的事情,for一直在運行,直到總數超過4,000,000。
例如,如果我每次將for循環添加到總數中,每次添加20,並且每次檢查總數是否大於50,它將一直運行到我得到60。不小於60,並且永遠不會為50,因為im添加每個20個。
由於循環為每個循環加20,在您的情況下是相同的,只需在循環內添加一個if,檢查總數是否大於實際所需的大小(如果是,則將其破壞)並且不添加該值將使其超過您的期望值。
所以:
我的循環應該在總數等於4,000,000之后停止,但是由於某種原因,總數為4,613,732。
您所添加的內容可能永遠不會使總數精確到4,000,000,如果是,則將您的條件更改為total <= 4000000;
而不是total < 4000000;
這是來自Euler項目2的問題陳述:
斐波那契數列中的每個新項都是通過將前兩個項相加而生成的。 從1和2開始,前10個術語將是:
1,2,3,5,8,13,21,34,55,89,...
通過考慮斐波那契數列中值不超過四百萬的項,找到偶值項的總和。
您誤認為“四百萬”是總和的上限,而實際上是各個數字的上限。
因此,循環條件應為i <= 4000000
; 但這還不是全部-您需要重新排列條件,因為i
是在循環內設置的,因此條件不會捕獲最后添加的數字。
for (var i;; x++, y++) {
i = arr[x] + arr[y];
if (i > 4000000) break; // move condition to here
arr.push(i);
if (i % 2 == 0) {
total += i
}
}
使用函數樣式表示遞歸函數時,我發現更容易思考自己的方式
const projectEuler2 = (limit = 0, sum = 0, a = 0, b = 1) => a > limit ? sum : projectEuler2 ( limit , a & 1 ? sum : sum + a , b , a + b ) console.log (projectEuler2 (4e6)) // 4613732
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.