尾调用和尾递归

尾调用 : 指函数最后一步调用另一个函数;

  • 为什么要用尾调用?尾调用优化代码的意义在哪里。
    函数在调用的时候会在调用栈(call stack)中存有一条记录,每一条记录叫做一个调用帧(call frame),每调用一个函数,就向栈中push一条记录,函数执行结束后依次向外弹出,直到清空调用栈。
    function a() {
      console.log('如果有帮助请点个赞,大兄弟');
    }
    function b() {
      a()
    }
    function c() {
      b()
    }
    c();

造成这样的结果是因为每个函数在调用另一个函数的时候,没有return该调用,所以执行引擎会认为你还没有调用完毕,会保留调用帧。

而如果使用尾调用优化,调用帧就永远只有一条,这个时候就会节省很大一部分的内存空间,维护了代码运行的流畅性。

function a() {
  console.log('如果有帮助请点个赞,大兄弟');
}

function b() {
  return a()
}

function c() {
  return b()
}
c();

 

以上代码就叫做尾调用优化,这个时候调用帧就永远只有一条,节省了部分内存。

尾递归

函数调用自身,称为递归。如果尾调用自身,就称为尾递归。

递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。

  • 计算一个数的阶乘,使用尾递归调用的优化
    function multiplication(n) {
      if (n === 1) return 1;
      return n * multiplication(n - 1)
    }
    multiplication(4)//24
    
    //尾递归
    function multiplication1(n,init){
      if(n === 1)return init;
      return multiplication1(n -1 ,n*init)
    }
    multiplication(4,1)//24
    
    //优化
    function multiplication2(n,init=1){
      if(n === 1)return init;
      return multiplication2(n -1 ,n*init)
    }
    multiplication2(4);//24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值