Javascript中的Euler Project 2

时间:2015-04-22 16:03:44

标签: javascript

我正在浏览Odin项目,其中一部分是在Euler项目中进行问题1-3。我对问题2感到难过: "通过考虑Fibonacci序列中值不超过四百万的项,找到偶数项的总和。"

我很沮丧!我究竟做错了什么?这是我到目前为止所拥有的。谢谢!

function f() {
  var fib = [];
  fib.push(1,2,3);
  var i = fib.length;
  var total = 0;
  while(fib[i] < 4000000) {
    var x = fib[i-2] + fib [i-1];
    if(x % 2 == 0) {
      total += x;
    }
  } return total;
}

console.log(f());

3 个答案:

答案 0 :(得分:1)

斐波那契序列从cat .\file | %{ if($_ -match "..."){ $_ -replace "...", '...' } else{ $_ -replace ".*", "" } } 开始,而不是1, 1, 2

此外,您的解决方案看起来会起作用,但您将序列中的每个数字存储而不是仅存储最后两个数字,因此这将相对地吞噬内存。

答案 1 :(得分:1)

作为@DLeh notes,斐波纳契序列以1,1,2开始 - 而不是1,2,3。但是,这并没有改变对偶数值项进行求和的结果。你遇到的问题是:

while(fib[i] < 4000000) {

fib[i]undefined,因此函数会立即退出,总数保持为0.同样在while循环中,您不会将序列中的下一个项目推送到数组中。以下代码修复了这两个问题:

function f() {
  var fib = [];
  fib.push(1,1);
  var i = fib.length;
  var total = 0;
  while(fib[i-1] < 4000000) {
    var x = fib[i-2] + fib [i-1];
    fib.push(x);
    i = fib.length;
    if(x % 2 == 0) {
      total += x;
    }
  } return total;
}

console.log(f()); //4613732

@DLeh还指出您存储的数字超过了所需的数量,此解决方案无需使用数组即可运行:

function f() {
    var f1 = 1;
    var f2 = 1;
    var total = 0;
    while (f2 < 4000000) {
        var t = f1 + f2;
        if (t % 2 == 0)
            total += t;
        f1 = f2;
        f2 = t;        
    }
    return total;
}
console.log(f()); //4613732

答案 2 :(得分:1)

只是为了咧嘴笑,请注意,您可以在不使用%+操作的情况下解决此问题。序列中的每三个值都是偶数。也就是说,2之后是3(奇数),然后3 + 25(奇数),但是这两个奇数之和使我们回到偶数( 8)并且循环重复。

因此:

function evenFibTotal(limit) {
    var a = 1, b = 1, c = 2, total = 0;

    while (c < limit) {
        total += c;
        a = b + c;
        b = a + c;
        c = a + b;
    }

    return total;
}

在每次迭代中,第二个尾随值被设置为序列中的下一个值(b + c),并且加上当前值是第一个尾随值,最后下一个偶数Fibonacci数是总和那两个。

(也有封闭的解决方案,但这并不好玩:)