尾递归优化
栈帧(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); // 递归调用成为了函数的最后一步操作
}