将Array传递给函数并通过递归添加它

时间:2012-11-06 21:25:04

标签: c arrays recursion

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

#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;
} 

5 个答案:

答案 0 :(得分:4)

您的代码存在一些问题:

  1. 您正在访问array[MAX],这是未定义的行为。
  2. Ans为零时,您的函数会返回未初始化的lim
  3. 递归调用中arraySum的第一个参数是错误的。
  4. 使用lim--是错误的。
  5. 由于这看起来像家庭作业,我会让你弄清楚如何解决这些问题。如果不是作业,您可能需要考虑递归是否适合作业。

答案 1 :(得分:1)

您在dArr[lim]上遇到未定义的行为,因为lim5且数组中包含0...4元素。

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

解决此问题后,您需要在递归中进一步传递dArr,因为dArr仅返回int

答案 2 :(得分:0)

MAX更改为4并将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;
    } 

答案 3 :(得分:0)

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

ArraySum(Array, MAX - 1);

OR

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

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

答案 4 :(得分: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是预先减少的。