javascript - Else if 语句对我来说似乎是合理的,但会破坏代码

标签 javascript arrays loops if-statement

我正在应对的挑战:

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

给定一个正整数 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”作为结果。

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

最佳答案

如果您只想对奇数斐波那契数求和,则可以调整您在 reduce 中使用的 lambda 以反射(reflect)这一点。

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 超出了数组的大小,因此加法操作数不会对实数求和。

关于javascript - Else if 语句对我来说似乎是合理的,但会破坏代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40311831/

相关文章:

ios - swift ios 通过循环为多个 subview 添加约束

javascript - Select2 使用 tags = true 自动选择第一个选项

javascript - 球从墙上弹起 - 暂停和恢复

Java 数组和循环

javascript - 比较 2 个对象数组并删除重复的 javascript

python - 数组元素的条件访问

bash - 限制循环中进程的cpu限制

javascript - 尝试初始化图表上的范围 slider 时出错

javascript - 即使我在服务器上有数据,Parse.com 查询也是空的

javascript - 为什么我的代码在 JavaScript 中返回错误 "missing : after property id"?