聊一聊递归的优化

58 阅读1分钟
  • 递归算法是一种直接或者间接调用自身函数或者方法的算法
  • 递归就是方法里调用自身。
  • 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
  • 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
  • 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

我们看一个求N的阶乘的示例

function factorial(n){

    if(index == 1) return 1;

    else return factorial(n - 1) * n;

}

执行过程大概是这样

画个流程图

有什么优化方法么?

/*

* 可以使用闭包处理

*/

function factorial(n){

    let sum = 1

    const func = i => {

        if(i == 1) sum *= i

        else {

            sum *= i

            func(i-1)

        }

    }

    func(n)

    return sum

}

尾递归

  • 尾调用,是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数
function factorial(n, sum = 1){

    console.log('index', n, 'sum*n', sum * n)

    return n == 1 ? sum * 1 : factorial(n - 1, n * sum)

}

看一下执行顺序