为何循环(增减计数器)及递归实现的阶乘函数均返回0?
问题排查:阶乘函数返回0的核心原因
看起来你遇到的问题大概率是阶乘计算的初始值设置错误——很多人会不小心把结果变量初始化为0而非1,这样不管后续怎么相乘,结果都会一直是0;递归实现也会因为基准条件写错踩同样的坑。你的主逻辑代码是没问题的,问题出在factorial函数的具体实现上,我来给你拆解分析:
错误实现的典型场景(导致返回0)
比如你可能写出了这样的代码:
// 非递归错误版:初始值设为0 int factorial(int x) { int result = 0; // 这里是关键错误! for (int i = 1; i <= x; i++) { result *= i; } return result; }
或者递归版的错误写法:
// 递归错误版:基准条件错误 int factorial(int x) { if (x == 0) return 0; // 0的阶乘数学定义是1,不是0 return x * factorial(x-1); }
正确的非递归实现
不管用递增还是递减循环,核心是把结果初始化为1(1是乘法单位元,乘任何数都不会改变其值),同时加上负数输入的合法性判断:
// 递增循环版本 int factorial(int x) { if (x < 0) { // 阶乘仅定义在非负整数范围 printf("Error: Factorial is undefined for negative numbers\n"); return -1; } int result = 1; for (int i = 1; i <= x; i++) { result *= i; } return result; } // 递减循环版本 int factorial(int x) { if (x < 0) { printf("Error: Factorial is undefined for negative numbers\n"); return -1; } int result = 1; for (int i = x; i >= 1; i--) { result *= i; } return result; }
正确的递归实现
递归的核心是遵守阶乘的数学定义:0! = 1,以此作为基准条件:
int factorial(int x) { if (x < 0) { printf("Error: Factorial is undefined for negative numbers\n"); return -1; } if (x == 0 || x == 1) { // 基准条件:0和1的阶乘都是1 return 1; } return x * factorial(x - 1); }
额外注意事项
- 当输入数字超过12时,
int类型会溢出(12! = 479001600,接近32位int的最大值2147483647),此时可以改用long long类型存储结果避免溢出。
内容的提问来源于stack exchange,提问作者coderredoc
相关产品推荐
相关产品推荐

