使用尾递归优化
递归调用时堆栈嵌套,会导致在递归结束前内存不能得到及时回收,且存在堆栈溢出的可能。使用尾递归优化可以解决这个问题。
首先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中的递归,尽量都写成尾递归吧。