You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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],递归过程会变成:
    1. 初始调用recursive(arr,3,0),i≠2,返回1 + recursive(arr,3,1)
    2. 调用recursive(arr,3,1),i≠2,返回1 + recursive(arr,3,2)
    3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:05:26