Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数组传递给函数并通过递归将其添加_C_Arrays_Recursion - Fatal编程技术网

C 将数组传递给函数并通过递归将其添加

C 将数组传递给函数并通过递归将其添加,c,arrays,recursion,C,Arrays,Recursion,em试图做的是将数组传递给一个函数,该函数将添加所有数组元素并返回输出。请帮帮我。我不知道我在这方面做错了什么:/ #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(i

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

#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
内部数组(内部*dArr,内部lim);
int main()
{
int数组[MAX]={9,7,4,2,10};
printf(“%d”,数组sum(数组,最大值));
返回0;
}
内部数组sum(内部*dArr,内部lim)
{
INTANS;
如果(lim>0)
Ans=dArr[lim]+arraySum(*dArr,lim--);
返回Ans;
} 

您在
dArr[lim]
上遇到未定义的行为,因为
lim
5
,数组中有元素
0…4

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


修复此问题后,您将希望在递归中进一步传递
dArr
本身,因为
dArr
只返回
int
,您在
dArr[lim]
上遇到未定义的行为,因为
lim
5
,并且数组中有元素
0…4

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


修复此问题后,您需要在递归中进一步传递
dArr
本身,因为
dArr
只返回
int
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;
    } 

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

您的代码有几个问题:

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

  • 因为这看起来像是家庭作业,我会让你找出如何解决这些问题。如果这不是作业,你可能想考虑递归是否是该项工作的正确工具。

    你的代码有几个问题:

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

  • 因为这看起来像是家庭作业,我会让你找出如何解决这些问题。如果这不是作业,你可能想考虑递归是否是该项工作的正确工具。

    < P>记住,计算机把<强> 0 < /强>作为第一个数字,所以你的数组将从元素[0 ]到元素[4 ]。您的代码从5开始并向下计数到1,这意味着在本例中元素[5]将返回垃圾,因为索引不存在。将Lim-1传递到函数中或手动更改函数中的值

    ArraySum(Array, MAX - 1);
    


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

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

    ArraySum(Array, MAX - 1);
    
    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;
    }
    

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

    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;
    }
    
  • 您应该将lim作为4而不是5来调用它。因为数组有5个从索引0到索引4的整数。第五个索引超出范围
  • --lim而不是lim,因为lim是后减量。这意味着首先传递值,然后递减。因此,每次arraySum函数得到的值都是4,而不是3、2、1和0(根据您的期望)--lim是预减量
  • 您应该将lim作为4而不是5来调用它。因为数组有5个从索引0到索引4的整数。第五个索引超出范围
  • --lim而不是lim,因为lim是后减量。这意味着首先传递值,然后递减。因此,每次arraySum函数得到的值都是4,而不是3、2、1和0(根据您的期望)--lim是预减量

  • dArr
    是指向整数的指针。解引用它会得到一个整数。不管怎样,为了实际的目的,使用<代码> STD::累积< /COD>。C和C++不是可互换的技术。在现实世界中,没有理由使用递归。<代码> DARR < /Cord>是一个指向整数的指针。解引用它会得到一个整数。不管怎样,为了实际的目的,使用<代码> STD::累积。C和C++不是可互换的技术。在实际应用中。我认为不初始化Ans的值是可以的,因为该值被分配给Ans而不是求和。我认为不初始化Ans的值是可以的,因为该值被分配给Ans而不是求和#包括int arraySum(int*dArr,int lim);int main(){int array[5]={9,7,4,2,10};printf(“%d”,arraySum(array,4));返回0;}int Ans=0;int