使用递归计算前n个自然数差的C程序输出错误排查求助
错误原因
- 核心问题是减法结合性逻辑错误:减法是左结合运算,你现有递归采用的是右结合逻辑,
return (a - difference(a - 1))实际展开为a - (a-1 - (a-2 - (... - 0))),等价于交替加减运算。以n=5为例,展开后计算式为5 - 4 + 3 - 2 + 1 = 3,和你得到的错误输出完全一致。 - 计算规则不匹配:你需要的是从n开始依次减去所有更小的自然数,即左结合运算
((5 - 4) - 3) - 2 - 1 = -5,和现有右结合逻辑完全不符。
解决方案
要求递归实现的前提下,可采用直观的递归求和后计算差值的方案:前n个自然数从大到小的差值等价于 n 减去前n-1个自然数的和,只需新增一个递归求和函数即可。
修正后完整代码:
#include <stdio.h> // 递归计算前a个自然数的和 int sum(int a) { if (a == 0) return 0; return a + sum(a - 1); } int difference(int a) { if (a == 1) return 1; // 差值为当前值减去前a-1个自然数的和 return a - sum(a - 1); } int main() { int n; printf("Enter number until which you want difference of:\n"); scanf("%d", &n); printf("The difference of numbers is %d", difference(n)); return 0; }
输入n=5时,代码输出为-5,符合预期结果。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

