如果声明对我来说似乎是合理的,但会破坏代码

时间:2016-10-28 19:16:26

标签: javascript arrays loops if-statement

我正在努力的挑战:

汇总所有奇数斐波纳契数

给定正整数num,返回小于或等于num的所有奇数Fibonacci数的总和。

Fibonacci序列中的前两个数字是1和1.序列中的每个附加数字是前两个数字的总和。 Fibonacci序列的前六个数字是1,1,2,3,5和8.

例如,sumFibs(10)应该返回10,因为小于10的所有奇数Fibonacci数都是1,1,3和5.

EX:

sumFibs(1000)应返回1785。

sumFibs(4000000)应返回4613732。

sumFibs(4)应返回5.

这里有我的作品:

function sumFibs(num) {
if (num === 1) {return 1;}
var fibList = [1, 1];
for(i=2; i < num; i++){
    if (fibList[i-1] + fibList[i-2] > num){
        break;
    }
    //else if ((fibList[i-1] + fibList[i-2])%2 !== 0){
    fibList.push(fibList[i-1] + fibList[i-2]);
    //}
}
return fibList.reduce(function(a, b){return a+b;});
}

它给出了Fibonacci序列的总和,偶数和奇数,直到小于或等于输入数字的值。

然而,部分挑战是只加上奇数。最初,我认为这很容易,但我最大的努力都失败了。我的代码中没有工作的部分被注释掉了。任何等于4或更高的输入都会产生&#34; NaN&#34;结果。

有人可以帮忙吗?非常感谢。

1 个答案:

答案 0 :(得分:4)

如果您只想对奇数斐波纳契数进行求和,那么您可以调整您在reduce中使用的lambda来反映这一点。

function sumFibs(num) {
    if (num === 1) {return 1;}
    var fibList = [1, 1];
    for(i=2; i < num; i++){
        if (fibList[i-1] + fibList[i-2] > num){
            break;
        }
        fibList.push(fibList[i-1] + fibList[i-2]);
    }
    return fibList.reduce(function(a, b){
        return a + b%2 * b;
    });
}

您评论的代码无法正常工作的原因是,为了首先计算斐波纳契数,您必须跟踪所有,而不仅仅是奇数。例如,要获得5,您必须计算2 + 3,只有在您首先录制2时才能这样做。

您获得NaN而不是其他错误号码的原因是您的循环期望fibList[i - 1]填充实数。 i每次迭代都会递增,但数组并不总是得到一个新元素。从某种意义上说,i超出了数组的大小,因此加法操作数并不是实数的总和。