如何实现斐波那契规则函数?输入序号返回对应斐波那契数值
修复斐波那契函数的问题
你的代码出现NaN的核心问题有两个:
- 数组
arr被放在for循环内部,每次迭代都会重新初始化为[0,1,1],之前计算的结果完全无法保留 - 当
i增长到3时,初始数组没有索引3的元素,arr[i]会返回undefined,和前一个数相加自然得到NaN
修复后的数组实现版本
把数组初始化移到循环外,同时处理边界情况,就能得到正确结果:
const fibonacci = function(num) { // 初始化斐波那契序列前两位 const arr = [1, 1]; // 输入1或2时直接返回1 if (num === 1 || num === 2) { return 1; } // 从第3位开始循环计算到第num位 for (let i = 2; i < num; i++) { const nextNum = arr[i - 1] + arr[i - 2]; arr.push(nextNum); } // 数组索引从0开始,第num位对应索引num-1 return arr[num - 1]; }; // 测试验证 console.log(fibonacci(4)); // 输出3 console.log(fibonacci(10)); // 输出55 console.log(fibonacci(12)); // 输出144 console.log(fibonacci(45)); // 输出1134903170
优化版(无需数组,节省内存)
如果不需要保存整个序列,只用两个变量存储前两位数值即可,空间复杂度更低:
const fibonacci = function(num) { if (num === 1 || num === 2) { return 1; } let prevPrev = 1; // 记录第n-2位数值 let prev = 1; // 记录第n-1位数值 let current; for (let i = 3; i <= num; i++) { current = prevPrev + prev; prevPrev = prev; prev = current; } return current; };
内容的提问来源于stack exchange,提问作者lunarchild
相关产品推荐
相关产品推荐

