js尾递归

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

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)

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容