尾递归是一种特殊的尾调用,即在函数尾部直接调用自身的递归函数
尾调用是指一个函数作为另一个函数的最后一条 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
可以看到,每次递归时,只保留了一个调用帧,不会占用更多的内存空间。