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