传统的递归思想:自已调用自已,但是调用栈里面的执行上下文会越来越多,容易暴栈。
采用尾递归可以规避这个问题:每次入栈出栈再入栈
尾调用
// 尾调用
function f(x){
return g(x);
}
// 伪代码
ECStack.push(<f> functionContext);
ECStack.pop();
ECStack.push(<g> functionContext);
ECStack.pop();
非尾调用
// 非尾调用
function f(x){
return g(x) + 1;
}
ECStack.push(<f> functionContext);
ECStack.push(<g> functionContext);
ECStack.pop();
ECStack.pop();
示例:阶乘
function factorial(n, res) {
if (n == 1) return res;
return factorial(n - 1, n * res)
}
console.log(factorial(4, 1)) // 24
来源:oschina
链接:https://my.oschina.net/u/2285087/blog/3157667