C语言递归实现1到n偶数乘积返回0问题求解
问题说明
需要使用C语言编写递归函数,计算1到n范围内所有偶数的乘积。参考偶数求和递归代码改写为乘积逻辑后,程序运行始终输出0,原始故障代码如下:
#include<stdio.h> int SumEven(int num1, int num2) { if(num1>num2) return 0; return num1*SumEven(num1+2,num2); } int main() { int num1=2,num2; printf("Enter your Limit:"); scanf("%d",&num2); printf("Sum of all even numbers in the given range is: %d",SumEven(num1,num2)); }
故障原因
- 递归终止条件返回值错误:求和逻辑的递归终止条件返回0是合理的,0是加法单位元,累加0不会改变最终求和结果;但乘法运算的单位元是1,终止条件返回0会导致整个递归调用链的所有乘法运算最终乘0,结果恒为0,这是程序输出0的核心原因。
- 数据类型容量不足:偶数乘积的增长速度远快于偶数和,常规32位
int类型的取值范围约为-21亿到21亿,当n≥20时,偶数乘积就会超出int的取值上限,触发整数溢出导致结果异常。 - 边界场景未覆盖:当用户输入的上限n小于2时,1到n范围内不存在偶数,按照数学定义空乘积的值为1,原代码未适配该场景。
- 文案语义错误:代码中的输出提示仍标注为“Sum(和)”,和实际计算乘积的逻辑不符。
修正方案
针对上述问题做对应修改:
- 将递归终止条件的返回值从0改为1,保证乘法链路计算结果正确
- 将存储乘积的变量类型从
int改为long long(64位长整型),扩大可支持的数值范围,常规测试场景下可支持n到30左右的偶数乘积计算(如果需要计算更大n的乘积,需要额外实现大数运算逻辑) - 增加n<2的边界判断,直接返回空乘积的结果1
- 修正输出提示文案,将“Sum”改为“Product(乘积)”,匹配实际计算逻辑
修正后的完整可运行代码:
#include<stdio.h> long long ProductEven(int current, int limit) { // 递归出口:当前值超过上限时返回乘法单位元1 if(current > limit) { return 1; } return current * ProductEven(current + 2, limit); } int main() { int start = 2, limit; printf("Enter your Limit:"); scanf("%d", &limit); if(limit < 2) { printf("Product of all even numbers in the given range is: 1"); return 0; } printf("Product of all even numbers in the given range is: %lld", ProductEven(start, limit)); return 0; }
测试验证
- 输入limit=6,计算逻辑为246=48,程序正确返回48
- 输入limit=2,程序正确返回2
- 输入limit=1,程序正确返回1
内容的提问来源于stack exchange,提问作者Guilhermando
相关产品推荐
相关产品推荐

