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

例如 sum 应该是 55 (1 + 2 + .... + 10) 和 product 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

两个想法:

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

对于它的价值,您的“累加器”函数在其他函数式编程上下文中也称为“减少” 。如果您想在 Google 上搜索该术语,这可能会有所帮助。

于 2013-02-25T17:07:33.107 回答
1

如果您设置temp = array[0]并开始循环,您的解决方案几乎就在那里,i = 1而不是i = 0.

于 2013-02-25T17:08:12.893 回答