0

配列の要素の平均を計算する再帰関数をどのように記述しますか?

これが私がこれまでに持っているものです:

int media(int numeros[], int i, int n) {
    if (i == n-1) return numeros[i]/n;  
    return numeros[i]/n + media(numeros, i + 1, n); 
}

しかし、それは機能しません。次の行が原因だと思います。if (i == n-1) return numeros[i]/n;

4

2 に答える 2

2

これはどう:

double media(int numeros[], int i, int n) {
    if (i == n - 1) {
        return numeros[i];
    }

    if (i == 0)
        return ((numeros[i] + media(numeros, i + 1, n)) / n);
    else
        return (numeros[i] + media(numeros, i + 1, n));
}

あなたがしていることは、各呼び出しの要素数で割ることです。これを行うと、不正確な平均が得られます。上記のコードはあなたが行っていたことを実行しますが、結果を返そうとしているため ( の場合i==0)、すべての要素の合計に基づいて実際の平均を計算します

于 2013-03-17T10:44:40.697 に答える
1

問題は、(整数への) 丸めのために各要素を除算すると、おそらく間違った答えが得られることです (整数による整数除算は整数を返します)。

の場合{1,2,3,4}、各要素を 4 -1/4 + 2/4 + 3/4 + 4/4で除算しますが、各除算は整数を返すため、それらはすべて 0 であり、結果は 0 です。

したがって、どちらかを作成しますdouble:(ただし、丸めのために、最後に分割する方が良いです)

double media(int numeros[], int i, int n){
   if (i == n-1) return 1.0*numeros[i-1]/n;  
   return 1.0*numeros[i]/n + media(numeros, i + 1, n); 
}

または最後に分割します:(Sean Landsmanが提案した方法、または以下のように)

int media(int numeros[], int i, int n){
   if (i == -1) return media(numeros, 0, n)/n;
   if (i == n-1) return numeros[i-1];
   return numeros[i] + media(numeros, i + 1, n);
}

発信者:

int media(array, -1, n);
于 2013-03-17T11:00:38.847 に答える