C语言数组递归求和函数错误基例原因咨询
递归计算数组总和的错误分析
我正在练习C语言递归函数,需求是编写递归函数计算数组中所有int类型元素的总和,且不能修改main函数。我知道正确的基例写法如下:
int recursive(int a[], int size, int i) { if (i>=size){ return 0; } return a[i] + recursive(a, size, i+1); }
但下面这段代码的基例写法无法正常工作,我想知道原因:
#include <stdio.h> int recursive(int a[], int size, int i) { if (i==size-1){ return a[size-1]; } return a[0] + recursive(a, size, i+1); } int main(void) { int arrSize; printf("Please enter the size of the array: "); scanf("%d", &arrSize); int arr[arrSize]; printf("Please enter the elements of the array: "); for (int i = 0; i < arrSize; i++) scanf("%d", &arr[i]); int result = recursive(arr, arrSize, 0); printf("The result is %d.\n", result); return 0; }
问题根源
这段代码的核心错误不是基例写法,而是递归的累加逻辑:
- 每次递归调用时,你都在累加数组的第一个元素
a[0],而不是当前索引i对应的元素a[i]。 - 举个例子,假设输入数组是
[1,2,3],递归过程会变成:- 初始调用
recursive(arr,3,0),i≠2,返回1 + recursive(arr,3,1) - 调用
recursive(arr,3,1),i≠2,返回1 + recursive(arr,3,2) - 调用
recursive(arr,3,2),i=2,返回3
最终计算结果是1+1+3=5,但正确总和应该是1+2+3=6——重复累加了第一个元素,完全漏掉了中间的元素。
- 初始调用
- 你的基例写法本身是合理的(当遍历到最后一个元素时直接返回它),但累加逻辑错误导致结果完全偏离预期。
修正方法
只需要把递归返回语句中的a[0]改成a[i],让每次递归都累加当前索引对应的元素:
int recursive(int a[], int size, int i) { if (i==size-1){ return a[size-1]; } return a[i] + recursive(a, size, i+1); }
这样修改后,递归过程会依次累加a[0]、a[1]、a[2],最终得到正确的总和。
内容的提问来源于stack exchange,提问作者tnwl.suzy
相关产品推荐
相关产品推荐

