0

入力関数(任意の関数の目的)、入力番号の配列、および入力配列の長さを持つ関数を作成するにはどうすればよいですか?

働き:

double accumulator(double (*function)(double, double), double array[], int length)

主要:

int main(){
   double array[10];

   for (int i=0; i<10; i++)
      array[i] = i+1;

   printf("Sum is: %g\n", accumulator(sum,array,10));
   printf("Product is: %g\n", accumulator(product,array,10));

   return 0;
}

たとえば、合計は55(1 + 2 + .... + 10)で、積362880(1 * 2 * ... * 10)である必要があります。関数は再帰的にすべきだと思いますが、それでも正しい結果を得ることができません:/

私はこの非再帰的な解決策を持っていますが、もちろんそれは合計に対してのみ機能します...

double accumulator(double (*function)(double, double), double array[], int length)
{
    int temp = 0;
    for (int i = 0;i<length;i++)
    {
        temp = (*function)(temp, array[i]);

    }
    return temp;
}

もちろん上に:

double sum(double x, double y){
    return x+y;
}
double product(double x, double y){
    return x*y;
}
4

4 に答える 4

4

何が問題になっていますか:

double multiplicator(double (*function)(double, double), double array[], int length)
{
    int temp = 1;
    for (int i = 0;i<length;i++)
    {
        temp = (*function)(temp, array[i]);

    }
    return temp;
}

別の関数を使用するか、操作にニュートラル要素を指定する必要があります(合計の場合は0、積の場合は1)。

于 2013-02-25T17:06:38.983 に答える
2

0何かを与えることで乗算するので、乗算には機能しません。0

最初の要素を初期値として使用する必要があります

double accumulator(double (*function)(double, double), double array[], int length)
{
    int temp = array[0]; 
    for (int i = 1; i < length;i++) // start from #1
    {
        temp = (*function)(temp, array[i]);

    }
    return temp;
}
于 2013-02-25T17:08:13.280 に答える
1

2つの考え:

  1. double tempではなくを使用する必要がありますint temp

  2. 加算と乗算では、開始値を変える必要があります。合計はで始まる必要temp = 0がありますが、製品はで始まる必要がありtemp = 1ます。それ以外の場合、製品は常に0になります。

    別の初期値パラメーターを追加することができます。

    double accumulator(double (*function)(double, double), double array[], int length, double initial)
    

    または、最初の配列要素を開始値として使用します(ただし、配列が空であるという特殊なケースを確認する必要があります)。

    double temp = array[0]; 
    

その価値については、他の関数型プログラミングのコンテキストでは、「アキュムレータ」関数は「reduce」としても知られています。あなたがその用語をグーグルしたいなら、それは役立つかもしれません。

于 2013-02-25T17:07:33.107 に答える
1

の代わりにでtemp = array[0]ループを設定して開始すれば、ソリューションはほぼ完成します。i = 1i = 0

于 2013-02-25T17:08:12.893 に答える