递归函数使用尾递归优化

尾调用:是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数


尾递归:把当前的运算结果(或路径)放在参数里传给下层函数,深层函数所面对的不是越来越简单的问题,而是越来越复杂的问题,因为参数里带有前面若干步的运算路径。


es6 尾调用只在开启严格模式才生效

//斐波那契数列
'use strict'
function Fib(n, n1 = 0, n2 = 1) {
    if(n == 0) {
        return n1
    }
    return Fib(n - 1, n2, n1 + n2)
}


// 阶乘
'use strict'
function factorial(n, res = 1) {
    if (n == 1) return res;
    return factorial(n - 1, n * res)
}


补充: 由于浏览器没有部署尾调用优化,所以在浏览器中实际还是会出现栈溢出的情况



参考:https://github.com/mqyqingfeng/Blog/issues/49

https://juejin.cn/post/6844903583368871944

确认 取消