使用尾递归优化

        递归调用时堆栈嵌套,会导致在递归结束前内存不能得到及时回收,且存在堆栈溢出的可能。使用尾递归优化可以解决这个问题。
        首先ES6支持了尾递归优化,递归调用发生函数的最后编译器会帮你做尾递归优化。
        拿阶乘举例:

const factorial = ( n )=>
  n === 1 ? 1 : n * factorial( n - 1 );

        上面代码的调用过程是这样的:

factorial( 4)
    4 * factorial( 3)
        4 * 3 * factorial( 2)
            4 * 3 * 2 * factorial( 1)
                4 * 3 * 2 * 1 * 1
            4 * 3 * 2 * 1
        4 * 3 * 2
    4 * 6
return 24

        使用尾递归优化:

const factorial = ( n, current = 1)=>
  n === 1 ? current : factorial( n - 1, n * current );

        那么调用结构就变成了

factorial(4)
    factorial(3,4)
    factorial(2,12)
    factorial(1,24)
return 24

        ES6中的递归,尽量都写成尾递归吧。

分享

Author | 何小亮

全栈开发工程师(Node.js,Golang).