【问题标题】:Else if statement seems rational to me but breaks code否则 if 语句对我来说似乎很合理但会破坏代码
【发布时间】:2016-10-28 19:16:25
【问题描述】:

我正在努力的挑战:

对所有奇数斐波那契数求和

给定一个正整数 num,返回所有小于或等于 num 的奇数斐波那契数的总和。

斐波那契数列的前两个数是 1 和 1。数列中的每个附加数都是前两个数的和。斐波那契数列的前六个数字是 1、1、2、3、5 和 8。

例如,sumFibs(10) 应该返回 10,因为小于 10 的所有奇数斐波那契数都是 1、1、3 和 5。

前:

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;});
}

它给了我斐波那契数列的总和,偶数和奇数,直到小于或等于输入数字的值。

然而,部分挑战是仅将奇数相加。最初,我认为这很容易,但我的最大努力都失败了。我的代码中不起作用的部分被注释掉了。任何等于或大于 4 的输入都会产生“NaN”作为结果。

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

【问题讨论】:

    标签: javascript arrays loops if-statement


    【解决方案1】:

    如果您只想对奇数斐波那契数求和,则可以调整您在 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 超出了数组的大小,因此加法操作数并不是实数相加。

    【讨论】:

    • 哇,这是一个非常巧妙的解决方法。但我的主要问题是为什么我的 else if 语句不起作用?对我未经训练的眼睛来说似乎应该如此。
    • @G.T.我在答案中添加了一句话。基本上,为了首先正确计算 fib 数,您需要 所有 个数。
    • "您的注释代码不起作用的原因是,为了首先计算斐波那契数,您必须跟踪所有这些数,而不仅仅是奇数。"哦,哇,这很有意义。尽管如此,它至少不会产生一个值而不是“NaN”吗?
    • 我的意思是,它不会是斐波那契数列,但至少它会是某种东西,对吧?
    • NaN 问题的发生是因为i 与数组的实际长度不同步。您正在尝试在数组末尾添加数字。这些是undefined,将+ 运算符应用于undefined 会产生NaN
    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 2019-07-05
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多