条件2的循环不符合

时间:2018-09-12 20:28:07

标签: javascript loops for-loop

我是一名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。

3 个答案:

答案 0 :(得分:0)

您的代码“没有”做任何不寻常的事情,for一直运行到总数超过4,000,000。

例如,如果我每次将for循环加到我的总数中,并且每次检查我的总数是否超过50,我将一直运行直到我得到60。 不小于60,并且永远不会是50,因为我每个都会增加20。

由于该循环为每个循环添加20,在您的情况下是相同的,因此只需在循环内部添加一个if,检查总数是否大于实际所需的大小(如果是),请将其破坏而不添加使其超出您期望值的值。

所以:

  

我的循环应该在总数等于4,000,000之后停止,但是对于   由于某种原因,总数为4,613,732。

您添加的内容可能永远不会使总数精确到4,000,000,如果只是将您的条件更改为total <= 4000000;而不是total < 4000000;

答案 1 :(得分:0)

这是Project Euler #2中的问题说明:

  

斐波那契数列中的每个新项都是通过将   前两个学期。从1和2开始,前10个学期将   是:

     

1、2、3、5、8、13、21、34、55、89,...

     

通过考虑斐波那契数列中值不   超过四百万,求出偶数项之和。

您误解了“四百万”是 sum 的上限,而实际上是各个数字的上限。

因此,循环条件应为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
  }
}

答案 2 :(得分:0)

使用函数样式表示递归函数时,我发现更容易思考自己的方式

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