JavaScript斐波那契生成器变量赋值问题求助
问题分析与修复
核心问题
你代码里的变量初始化逻辑完全错误:
- 你在
output还是空数组的时候就定义了lastNumber、nPrev、newNumber,这时候output[output.length-1]等价于output[-1],结果是undefined,两个undefined相加得到NaN。 - 更关键的是,这些变量只在函数开头计算了一次,循环里不会随着
output的更新重新计算新数值,导致你反复push的都是一开始就错的NaN。
修复后的代码
把计算新数值的逻辑放到循环内部,每次循环都基于当前output的最后两个元素计算新值:
function fibonacciGenerator(n) { var output = []; if (n === 1) { output = [0]; } else if (n === 2) { output = [0, 1]; } else { output = [0, 1]; for (var i = 2; i < n; i++) { // 每次循环都重新获取当前最后两个数计算新值 var lastNumber = output[output.length - 1]; var nPrev = output[output.length - 2]; var newNumber = lastNumber + nPrev; output.push(newNumber); } } return output; } console.log(fibonacciGenerator(5)); // 输出 [0, 1, 1, 2, 3]
优化版(避免重复取数组元素)
如果不想每次都从数组里取元素,可以用两个变量跟踪最后两个值,效率更高:
function fibonacciGenerator(n) { if (n === 1) return [0]; if (n === 2) return [0, 1]; const output = [0, 1]; let prev = 0; let curr = 1; for (let i = 2; i < n; i++) { const next = prev + curr; output.push(next); prev = curr; curr = next; } return output; } console.log(fibonacciGenerator(5)); // 输出 [0, 1, 1, 2, 3]
内容的提问来源于stack exchange,提问作者Milla Bukova
相关产品推荐
相关产品推荐

