我正在编写一个用于改进递归函数学习的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);
}
答案 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
。