适当的尾调用可以避免递归调用时的栈膨胀
js有个执行栈,每当要执行一个函数时都会将这个函数推入栈,执行完从栈弹出。
下面是没有尾递归和尾递归的对比
function Fei(num) {
if(num<=1){
return 1
}
return num * Fei(num-1)
}
这个是没有尾递归的递归函数,当执行Fei(4)时过程如下
4 * Fei(3)
4 * Fei(3) * Fei(2)
4 * Fei(3) * Fei(2) * Fei(1)
从上面看出,当num越大时,递归调用的栈就非常大(开始执行函数就把函数压如栈,执行完弹出)
下面是使用了尾递归之后的函数
function Fei(num,total=1) {
if(num <= 1){
return total
}else{
return Fei(num-1,total*num)
}
}
当执行Fei(4)时过程如下
Fei(3,4)
Fei(2,12)
Fei(1,24)
从上不难看多,尾递归一直只存在一个函数在栈中,这样就不会造成栈膨胀了