Appearance
递归
下面主要讲解 JS 中的递归、递归爆栈问题、尾递归(递归优化)
js
function main(n) {
if (n === 0) {
return 'finish';
} else {
return main(n - 1);
}
}
console.log(main(200000));
如果是 console.log(main(2));
那么调用栈里面的大小就是 4 如果是 200000 那么其 200002 个,而我们通过
js
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
computeMaxCallStackSize(); //12577
那我们执行 console.log(main(12575));
的时候刚好 执行 console.log(main(12576));
就会出现 Uncaught RangeError: Maximum call stack size exceeded
这就是我们著名的递归爆栈问题
尾递归优化
其实在 ES5 中仍然没有对尾递归优化进行处理
js
function fibonacci(n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
当我们执行 fibonacci(5)
其执行栈
[fibonacci(5)]
[fibonacci(4) + fibonacci(3)]
[(fibonacci(3) + fibonacci(2)) + (fibonacci(2) + fibonacci(1))]
[((fibonacci(2) + fibonacci(1)) + (fibonacci(1) + fibonacci(0))) + ((fibonacci(1) + fibonacci(0)) + fibonacci(1))]
[fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(0) + fibonacci(1)]
很容易最后一行就栈溢出了
那么我们怎么解决这个问题
function fibonacci(n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}