如何管理浮动的递归返回?

时间:2011-11-08 06:43:23

标签: c function recursion

我正在编写一个用于改进递归函数学习的C代码。我的函数必须计算数组中接收的一组数字的平均值。我必须计算数组中数字的总和,甚至要返回它,同样我要计算函数内部的平均值(我打印过它)但是当我做返回时,main函数总是得到一个垃圾数字

这是我的代码:

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

4 个答案:

答案 0 :(得分:6)

问题在于:

return f/z;

您的函数应该计算总和,但您已经除以元素数。

将其更改为:

return f;

除以主要元素的数量:

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

答案 1 :(得分:1)

我相信您正在访问array[n]以获取大小为n的数组。这样一个数组中的最后一个索引是n-1

答案 2 :(得分:1)

在递归中,您假设sum返回总和,但它实际上返回平均值。

答案 3 :(得分:1)

首先,在来自sum的{​​{1}}调用中,您使用数组中的项目数来调用它,然后在main中使用它作为索引进入数组,这将是数组之外的未知区域。

然后我认为你应该检查算法...如果用数字2,4和8调用你将获得2.66667的平均值,这远远低于4.6667的适当平均值。只需在递归函数中求和,然后将结果除以sum中的n