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

 

  • 为什么要用尾调用?尾调用优化代码的意义在哪里。
    函数在调用的时候会在调用栈(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

     

 

相关文章:

  • 2022-12-23
  • 2021-05-23
  • 2021-09-26
  • 2022-12-23
  • 2022-12-23
  • 2021-08-24
  • 2022-02-15
猜你喜欢
  • 2022-12-23
  • 2022-03-06
  • 2022-01-17
  • 2021-07-03
  • 2021-04-03
相关资源
相似解决方案