我正在应对的挑战:
对所有奇数斐波那契数求和
给定一个正整数 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/