0

他们试图做的是将数组传递给一个函数,该函数将添加所有数组元素并返回输出。请帮我。我不知道我在这做错了什么:/

#include <stdio.h>
#define MAX 5

int arraySum(int *dArr,int lim);

int main()
{
    int array[MAX] = {9,7,4,2,10};
    printf("%d", arraySum(array, MAX));
    return 0;
}
int arraySum(int *dArr,int lim)
{
    int Ans;
    if(lim>0)
    Ans = dArr[lim] + arraySum(*dArr, lim--);
    return Ans;
} 
4

5 回答 5

4

您的代码有几个问题:

  1. 您正在访问array[MAX],这是未定义的行为。
  2. 您的函数在为零Ans时返回未初始化的值。lim
  3. arraySum递归调用中的第一个参数是错误的。
  4. 的使用lim--是错误的。

由于这看起来像家庭作业,我会让你弄清楚如何解决这些问题。如果这不是家庭作业,您可能需要考虑递归是否适合这项工作。

于 2012-11-06T21:28:23.667 回答
1

您在 上遇到未定义的行为dArr[lim],因为limis5并且该数组具有元素0...4

当 时,您还会得到未定义的行为lim==0,因为您返回未初始化的Ans。当您声明它时,将其初始化为dArr[0].

修复此问题后,您将希望dArr在递归中进一步传递自身,因为dArr仅返回一个int.

于 2012-11-06T21:26:28.027 回答
0

更改MAX4并将if(lim>0)条件更改为 if(lim>=0)

这将使您的递归添加为dArr[4]+dArr[3]+dArr[2]+dArr[1]+dArr[0]数组的所有 5 个元素。

编辑:更正的程序:

   int main()
   {
     int array[MAX] = {9,7,4,2,10};
     printf("%d", arraySum(array, MAX-1));
     return 0;
   }

    int Ans = 0;
    int arraySum(int *dArr,int lim)
    {
       if(lim>=0){
          Ans = dArr[lim] + arraySum(dArr, lim-1);
        }
       return Ans;
    } 
于 2012-11-06T21:28:08.643 回答
0

请记住,计算机将0视为第一个数字,因此您的数组将从元素 [0] 到元素 [4] 编号。您的代码从 5 开始倒数到 1,这意味着在这种情况下 elements[5] 将返回垃圾,因为索引不存在。将 Lim - 1 传递给函数或手动更改函数中的值。

ArraySum(Array, MAX - 1);

或者

ArraySum(//....)
{
lim--;
//code here....
}

编辑:您还需要将 ans 初始化为某个值,因此如果传递了一个零元素数组,该函数将不会返回未初始化的变量。

于 2012-11-06T21:28:40.053 回答
0
int arraySum(int *dArr,int lim)
{
    int Ans;
    if(lim>=0) // note the change here
    Ans = dArr[lim] + arraySum(dArr, --lim); // note the --lim change here
    return Ans;
}
  1. 您应该使用 lim 作为 4 而不是 5 来调用它。因为数组有 5 个从索引 0 到索引 4 的整数。第 5 个索引超出范围。
  2. --lim 而不是 lim-- 因为 lim-- 是后减量。这意味着该值首先被传递然后递减。因此,每次您的 arraySum 函数将值设为 4 而不是 3、2、1 和 0(根据您的期望)。--lim 是预减量。
于 2012-11-06T21:29:13.923 回答