You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求小于等于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;
}

关键修正点

  1. 循环终止条件:判断下一个斐波那契数是否超过num,确保只处理符合要求的数
  2. 空间优化:去掉数组,用三个变量记录状态,避免不必要的内存占用
  3. 初始值设置:sum初始为1,因为序列里第一个奇数是1(0是偶数,不参与求和)
  4. 逻辑顺序:先生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:25:19