求小于等于num的奇数Fibonacci数之和代码调试求助
问题:求小于等于给定值的奇数斐波那契数之和代码排查
题目要求:求所有小于等于给定正整数num的奇数Fibonacci数之和。Fibonacci序列的前两个数是0和1,后续每个数是前两个数之和,例如
sumFibs(10)应返回10(对应奇数为1、1、3、5)。
我的代码在num=4时运行正常,但num=1000等用例测试失败,代码如下:
function sumFibs(num){ const fibonaciArr = [0,1]; let add = 0; for(let i = 0; i < num; i++){ if(fibonaciArr[i+1]%2 !== 0) add+=fibonaciArr[i+1]; fibonaciArr.push(fibonaciArr[i] + fibonaciArr[i + 1]) } return add; }
我用数组生成斐波那契序列来验证正确性,但还是通不过全部测试,求排查问题。
问题分析与修复
你的代码核心问题是循环逻辑错误:
- 你用
i < num作为循环条件,这会让程序生成num次新的斐波那契数,完全没考虑生成的数是否超过num本身。比如num=1000时,循环会执行1000次,生成远大于1000的数,还把这些超出范围的奇数也累加到结果里,自然会得到错误值。 - 另外,这种固定次数的循环也会导致当num很小的时候,可能提前停止生成需要的数(不过你测试num=4时碰巧结果正确)。
修正后的代码
不需要用数组存储所有序列,用变量记录前两个数更高效,同时循环直到生成的数超过num为止:
function sumFibs(num) { if (num < 1) return 0; let sum = 1; // 初始包含序列里第一个奇数1 let prev = 0; let curr = 1; while (true) { const next = prev + curr; if (next > num) break; // 超出范围就停止 if (next % 2 !== 0) { sum += next; } prev = curr; curr = next; } return sum; }
关键修正点
- 循环终止条件:判断下一个斐波那契数是否超过num,确保只处理符合要求的数
- 空间优化:去掉数组,用三个变量记录状态,避免不必要的内存占用
- 初始值设置:sum初始为1,因为序列里第一个奇数是1(0是偶数,不参与求和)
- 逻辑顺序:先生成next,先判断是否超出范围,再判断奇偶累加,避免无效计算
验证示例
sumFibs(10):生成的数为0、1、1、2、3、5、8,其中奇数1、1、3、5的和为10,符合题目要求sumFibs(4):生成的数为0、1、1、2、3,奇数1、1、3的和为5,和你原代码的正确结果一致
内容的提问来源于stack exchange,提问作者Brian Waweru
相关产品推荐
相关产品推荐

