JavaScript递归实现Fibonacci数列为何陷入无限循环?
斐波那契函数无限循环问题分析
先看你写的代码:
function fibbi(number) { for (let number = 0; number < 10; number++) { console.log(fibbi(number)); }if (number < 2) { return number; } else { return fibbi(number - 1) + fibbi(number - 2); } } fibbi(10);
无限循环的原因
- 局部变量覆盖入参:函数内部的for循环里用
let number = 0重新声明了同名局部变量,直接覆盖了函数的入参number。 - 无限递归触发:当调用
fibbi(10)时,函数先执行这个for循环,循环变量从0开始,第一次就调用fibbi(0);而fibbi(0)执行时,又会先跑这个for循环,再次调用fibbi(0)——相当于每次调用fibbi都会无限套娃调用fibbi(0),永远到不了后面的终止判断if (number < 2),自然陷入无限循环。
为什么把for循环放外面就没问题
把for循环移到函数外后,fibbi函数只负责计算斐波那契值:
- 调用
fibbi(n)时会直接执行终止条件判断,当n < 2时直接返回n,递归会正常收敛,不会出现无限调用的情况。
修正后的示例代码
// 专门计算斐波那契值的函数 function fibbi(number) { if (number < 2) { return number; } else { return fibbi(number - 1) + fibbi(number - 2); } } // 外部循环调用并输出结果 for (let i = 0; i < 10; i++) { console.log(fibbi(i)); }
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

