递归函数必须有明确终止条件,否则会无限调用导致栈溢出;如阶乘中n==0或n==1是必要出口,常见错误是终止条件遗漏(如只写n==2而忽略n==1)或条件不全。
递归函数必须有明确的终止条件
没有终止条件的递归会无限调用自身,最终导致栈溢出(Stack overflow)。比如计算阶乘时,n == 0 或 n == 1 就是必须写的出口。
常见错误是把终止条件写成 n == 2 却忘了处理 n == 1,或者用 n 但没考虑负数输入——C++ 不会自动拦截负数,得靠逻辑判断或断言。
- 推荐统一用
n == 0作为基础情形(因为数学上定义0! = 1) - 如果参数类型是
unsigned int,可省略负数检查;但若用int,建议加if (n 或抛异常 - 不要依赖编译器优化尾递归——标准 C++ 不保证尾递归优化,
gcc -O2可能生效,但不可移植
阶乘递归实现要小心整型溢出
int 在大多数平台最多表示到 12!(479001600),13! 就溢出了;long long 也只撑到 20!(约 2.4e18)。这不是递归本身的问题,而是数值范围限制。
示例代码: