JavaScript实现获取小于等于指定数值的斐波那契数列函数存在末尾元素错误问题排查
问题分析与修复方案
嘿,我来帮你揪出这个bug的核心问题~
你当前的代码逻辑有个关键漏洞:只检查了数组最后一个现有元素是否小于num,就直接生成并push下一个斐波那契数,但完全没验证这个新生成的数是否符合「小于等于num」的要求。
举个例子,当num=20时,递归到最后一步,数组是[1,1,3,5,13],此时13 < 20,代码会直接计算13+5=21并push进去,但21明显大于20,这就导致结果多了一个不符合要求的元素。
修复后的递归实现
只需要修改判断逻辑:先计算出下一个斐波那契数,再判断它是否小于等于num,符合条件才push进数组:
function findFibs(num) { if (num < 1) { return []; // 兼容num小于1的情况,可根据你的需求调整 } else if (num === 1) { return [1, 1]; // 匹配你预期的初始值 } else { var fibs = findFibs(num - 1) const last = fibs[fibs.length - 1]; const secondLast = fibs[fibs.length - 2]; const nextFib = last + secondLast; // 关键修改:判断新生成的数是否符合要求 if (nextFib <= num ) { fibs.push(nextFib) } return fibs; } } console.log(findFibs(20)); // 输出:[1, 1, 3, 5, 13]
更高效的迭代实现(推荐)
递归写法对于较大的num可能存在栈溢出风险,迭代写法逻辑更直观,也更高效:
function findFibs(num) { if (num < 1) return []; const fibs = [1, 1]; let nextFib; while (true) { nextFib = fibs[fibs.length - 1] + fibs[fibs.length - 2]; // 一旦下一个数超过num,立即停止循环 if (nextFib > num) break; fibs.push(nextFib); } return fibs; } console.log(findFibs(20)); // 输出:[1, 1, 3, 5, 13]
内容的提问来源于stack exchange,提问作者tscrosbie_walsh
相关产品推荐
相关产品推荐

