尾递归(Tail Recursion) 是一种特殊的递归形式,其特点是递归调用是函数的 最后一步操作。尾递归可以被编译器优化为迭代形式,从而避免递归调用带来的栈溢出问题,并提升性能。
以下是尾递归的详细说明和优化原理:
1. 尾递归的定义
-
核心特征:递归调用是函数的最后一步操作(即递归调用后没有其他计算)。
-
优化条件:编译器支持尾递归优化(Tail Call Optimization, TCO)。
示例:尾递归 vs 普通递归
// 普通递归(非尾递归)
int factorial(int n) {
if (n == 0) return 1;
return n * factorial(n - 1); // 递归调用后还有乘法操作
}
// 尾递归
int factorial_tail(int n, int acc = 1) {
if (n == 0) return acc;
return factorial_tail(n - 1, n * acc); // 递归调用是最后一步操作
}
2. 尾递归的优化原理
(1) 普通递归的问题
-
栈空间消耗:每次递归调用都会在栈上分配新的帧,深度递归可