簡體   English   中英

條件2的循環不符合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM