递归函数在哪里终止?结合C语言阶乘递归代码的疑问
递归阶乘逻辑答疑
你提供的代码如下:
#include <stdio.h> int factorial(int n); void main() { int n; printf("Enter your number : " ); scanf("%d",&n); if(n <= 1) { printf("The factorial of the number n is ",n); } else { int res = factorial(n); printf("The result is %d\n",res); } } int factorial(int n) { if(n <= 1) return 1; return n * factorial(n-1); }
你的疑惑核心是对函数分支执行逻辑的误解,递归不会走到n=-1的原因很简单:只要if(n <= 1)的判断条件成立,函数就会直接执行return 1语句终止,后续的return n * factorial(n-1)代码完全不会运行,自然不会继续调用参数更小的factorial。就算你主动传入n=0调用factorial,同样会直接命中终止条件返回1,不会触发后续递归调用,不可能出现n=-1、-2的情况。
我们拿你测试的输入5举例,完整的调用栈流程如下:
- 第一步:调用
factorial(5),n=5不满足n<=1,执行后续逻辑,计算5 * factorial(4),触发factorial(4)调用 - 第二步:调用
factorial(4),n=4不满足终止条件,计算4 * factorial(3),触发factorial(3)调用 - 第三步:调用
factorial(3),n=3不满足终止条件,计算3 * factorial(2),触发factorial(2)调用 - 第四步:调用
factorial(2),n=2不满足终止条件,计算2 * factorial(1),触发factorial(1)调用 - 第五步:调用
factorial(1),n=1满足n<=1,直接返回1,没有后续递归调用,递归链在此处完全终止
之后就会反向计算结果:2*1=2 → 3*2=6 → 4*6=24 → 5*24=120,最后把120返回给main函数输出。
另外补充两个你代码里的小问题:
- main函数的标准写法是
int main(void),执行结束需要return 0,void main()是部分编译器支持的非标准写法 - 你
n<=1分支的printf语句漏了占位符,应该改成printf("The factorial of the number %d is 1\n",n);,否则输入1的时候输出格式是错误的
内容的提问来源于stack exchange,提问作者Aryan
相关产品推荐
相关产品推荐

