尾递归是一种特殊的尾调用,即在函数尾部直接调用自身的递归函数

10 min read

尾递归是一种特殊的尾调用,即在函数尾部直接调用自身的递归函数

尾调用是指一个函数作为另一个函数的最后一条 return 语句被调用

尾递归的特点是,每次递归时,只保留一个调用帧,不会产生额外的内存开销,因此可以避免栈溢出的风险。

要计算 n 的阶乘,可以使用以下的尾递归函数:

// 定义一个尾递归函数,接收两个参数,n 和 result
// n 是要计算的阶乘数,result 是上一次递归的结果
function factorial(n, result) {
  // 如果 n 等于 1,说明递归结束,返回 result
  if (n === 1) return result
  // 否则,继续递归,将 n - 1 和 n * result 作为参数传入
  return factorial(n - 1, n * result)
}
// 调用函数,传入 n 和初始的 result 值 1
console.log(factorial(5, 1)) // 120

这段代码的执行过程如下:

factorial(5, 1)
=> factorial(4, 5)
=> factorial(3, 20)
=> factorial(2, 60)
=> factorial(1, 120)
=> 120

可以看到,每次递归时,只保留了一个调用帧,不会占用更多的内存空间。