js尾递归

2019-06-26  本文已影响0人  杯莫停_5273

适当的尾调用可以避免递归调用时的栈膨胀

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)

从上不难看多,尾递归一直只存在一个函数在栈中,这样就不会造成栈膨胀了

上一篇下一篇

猜你喜欢

热点阅读