Как управлять рекурсивным возвратом поплавка?

Я пишу код C для улучшения обучения рекурсивным функциям. Моя функция должна вычислить среднее значение набора чисел, полученных в массиве. Мне нужно вычислить сумму чисел в массиве, даже чтобы вернуть его, то же самое я должен вычислить среднее значение внутри функции (я напечатал его), но когда я делаю возврат, основная функция всегда получает мусорное число .

Это мой код:

#include <stdio.h>
#include <stdlib.h>

float sum (int array[], int n)
{
    float f; float z=n;
    if (n==0) return (array[n]);
    f=(array[n]+sum(array,n-1));;
    return f/z;
}

int main ()
{
    int *array, n, i;
    float result;

    printf("\nDimension de tu array: ");
    scanf("%d", &n);
    array=(int *) malloc (n*sizeof (int));

    for (i=0; i<n; i++)
    {
        printf("Valor en A[%d]: ", i+1);
        scanf("%d", &array[i]);
    }
    result=sum(array,n);
    printf("\n\nEl promedio es igual a: %f ", result);
}

person diegoaguilar    schedule 08.11.2011    source источник
comment
Другие мелочи, которые могут помочь улучшить ваш код. (1) Не используйте float, если у вас его нет из-за нехватки места или около того. Естественный тип с плавающей запятой — double, константы, как вы их обычно пишете (1.0, 1E-23), имеют тип double. (2) Не применяйте возврат malloc, однажды это может скрыть тот факт, что вы забыли включить stdlib.h.   -  person Jens Gustedt    schedule 08.11.2011


Ответы (4)


Проблема здесь:

return f/z;

Ваша функция должна вычислять сумму, но вы уже делите на количество элементов.

Измените его на:

return f;

И разделите на количество элементов в вашем main:

result = sum(array,n) / n;

И другая ошибка здесь:

if (n==0) return (array[n]);
f=(array[n]+sum(array,n-1));;

должно быть (и с отступом):

if (n==0)
    return array[n - 1];
f = array[n - 1] + sum(array,n-1);

Последний индекс массива n - 1, а не n.

person Mysticial    schedule 08.11.2011
comment
+1, но есть еще одна ошибка - array[n] должно быть array[n-1] в определении sum. - person Kiril Kirov; 08.11.2011
comment
Ах да, ты прав. Спасибо что подметил это. Добавлю к ответу. - person Mysticial; 08.11.2011
comment
+1, также нет необходимости использовать float в рекурсивной функции, поскольку все значения равны int - person Vladimir; 08.11.2011

Я полагаю, что вы обращаетесь к array[n] для массива размером n. И последний индекс в таком массиве n-1

person Basile Starynkevitch    schedule 08.11.2011

В рекурсии вы предполагаете, что sum возвращает сумму, но на самом деле возвращает среднее значение.

person Igor Oks    schedule 08.11.2011

Прежде всего, при вызове sum из main вы вызываете его с количеством элементов в массиве, а затем в sum вы используете это как индекс в массиве, который будет неизвестной областью за пределами массива.

И тогда, я думаю, вам следует проверить алгоритм... Если коллировать с номерами 2, 4 и 8, вы получите среднее значение 2,66667, что далеко от правильного среднего значения 4,6667. Просто выполните суммирование в рекурсивной функции и разделите результат на n в main.

person Some programmer dude    schedule 08.11.2011