【JavaScript】尾递归优化
下面是一个例子:
// Without tail recursion optimization
function factorial(n) {
if (n === 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
factorial(1000000); // 120
// With tail recursion optimization
function factorial(n, acc = 1) {
if (n === 0) {
return acc;
} else {
return factorial(n - 1, n * acc);
}
}
factorial(5); // 120
这个例子中,我们可以看到尾递归优化前后的区别。在第一个函数中,每次递归都会创建一个新的栈帧,直到栈溢出。而在第二个函数中,每次递归都会更新参数,而不是创建新的栈帧。这样可以避免栈溢出的问题。¹