JavaScript中的递归即函数内调用函数自身,但递归是非常耗内存的,每一次调用都会分配一定的栈空间,达到一定的数量(具体看浏览器)便会溢出报错。
function recursion (num) {
if (num === 1) {
return 1;
}
return num + recursion(--num);
}
console.log(recursion(5)); // 15
console.log(recursion(1000)); // 500500
console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded
对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。
'use strict';
function recursion (num, total = 0) {
if (num === 1) {
return total + 1;
}
return recursion(num - 1, total + num);
}
console.log(recursion(5)); // 15
console.log(recursion(1000)); // 500500
console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded
实际上还是报错了:D。