尾递归优化

文章目录

  • 尾递归优化
  • 优化方式

尾递归优化

栈帧(Stack Frame)是一个用于保存函数调用时所需的所有信息的数据结构。在函数调用过程中,每次调用会为其生成一个新的栈帧,通常存储在调用堆栈(Call Stack)中。每个栈帧包含了有关函数调用的信息,例如局部变量、参数和返回地址等。

  • 当函数中的递归调用是最后一步操作时(只是调用自身,而没有其它运算依赖下一步的调用结果再继续执行),此时,编译器或解释器可以优化递归调用,在调用堆栈中重用前一个函数调用生成的栈帧,而不是为每次递归调用创建新的栈帧。
  • 当在调用堆栈中重用栈帧时,递归调用不再占用额外的内存空间。这样,无论递归调用的执行次数如何,都只会使用一个栈帧的内存空间。在内存受限的情况下,尾递归可以避免因多次嵌套调用(普通递归)而引发的栈溢出问题。

优化方式

在递归调用之前已经执行了所有其他操作

  • 斐波那契数列尾递归优化
    • 在传给递归调用的参数中完成了乘法操作 n * accumulator
// 常规递归
function factorial(n) {
  if (n === 0) {
    return 1;
  }
  return n * factorial(n - 1); // 递归调用结束后,还需要和 n 相乘,递归调用不是最后一步
}

// 尾递归优化
function factorial(n, accumulator = 1) {
  if (n === 0) {
    return accumulator;
  }
  return factorial(n - 1, n * accumulator); // 递归调用成为了函数的最后一步操作
}

你可能感兴趣的:(前端算法,开发语言,javascript,前端,算法)