0

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

5 に答える 5

4

コードにはいくつかの問題があります。

  1. にアクセスしていますがarray[MAX]、これは未定義の動作です。
  2. あなたの関数は、ゼロのAnsときに初期化されていないものを返します。lim
  3. arraySum再帰呼び出しの最初の引数が間違っています。
  4. の使い方lim--が間違っています。

これは宿題のように思えるので、これらの問題を解決する方法を見つけてもらいましょう。これ宿題でない場合は、再帰がその仕事に適したツールであるかどうかを検討することをお勧めします。

于 2012-11-06T21:28:23.667 に答える
1

で未定義の動作が発生します。dArr[lim]これlim5、配列に要素があるためです0...4

lim==0また、初期化されていないを返すため、が未定義の動作をしますAns。宣言するときは、に初期化しdArr[0]ます。

これを修正した後は、を返すだけなdArrので、再帰で自分自身をさらに渡す必要があります。dArrint

于 2012-11-06T21:26:28.027 に答える
0

に変更MAX4if(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 を 5 ではなく 4 として呼び出す必要があります。配列には、インデックス 0 からインデックス 4 までの 5 つの整数があるためです。5 番目のインデックスは範囲外です。
  2. --lim の代わりに lim-- lim-- は後減分であるため。つまり、値が最初に渡されてからデクリメントされます。したがって、arraySum 関数が値を 3、2、1、0 ではなく 4 として取得するたびに (期待どおり)。--lim はプレデクリメントです。
于 2012-11-06T21:29:13.923 に答える