Функция, которая считает произвольную функцию 1 - 10 в C

Как я пишу функцию, у которых есть функция ввода (цель к какой-либо функции), множество входных чисел и длина входного массива?

Функция:

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

на вершине, конечно:

double sum(double x, double y){
    return x+y;
}
double product(double x, double y){
    return x*y;
}
0
nl ja de

4 ответы

Что не так с:

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

Или различная функция или вы должны поставлять нейтральный элемент для операции (0 за сумму, 1 для продукта).

4
добавлено
Для случая границы (пустой массив) всегда необходимо поставлять нейтральный элемент.
добавлено автор fceller, источник

It doesn't work for multiplication because multiplying anything by 0 gives, well 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;
}
2
добавлено
да, это работает!:) я думал, что это будет меня более сложный, вначале я был близок, и по мне скучали только одна линия: интервал работает временно = множество [0]; :)
добавлено автор kelly, источник

Две мысли:

  1. You should use double temp rather than int temp.

  2. You need to have a different starting value for addition versus multiplication. A sum should start at temp = 0, but a product should start at temp = 1. Otherwise the product will always be 0.

    You could add add another initial value parameter:

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

    Or you use the first array element as the starting value (but then you'll need to check for the special case where the array is empty):

    double temp = array[0]; 
    

Если это имеет значение ваша функция "сумматора" альтернативно известна как "уменьшить" в другое контексты функционального программирования. Это может помочь, если вы хотите к Google термин.

1
добавлено

Ваше решение почти там, если вы устанавливаете временного секретаря = множество [0] и начинают вашу петлю в я = 1 вместо я = 0 .

1
добавлено