递归

独自空忆成欢 提交于 2020-02-25 17:19:05

传统的递归思想:自已调用自已,但是调用栈里面的执行上下文会越来越多,容易暴栈。

采用尾递归可以规避这个问题:每次入栈出栈再入栈

尾调用

// 尾调用
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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!