使用递归查找整数数组的平均值

3

我正在尝试使用递归计算数组中整数元素的平均值。我知道如何使用循环来完成,但是我的作业要求我使用递归来完成。因此,我尝试使用递归来计算元素的总和,然后将总和除以数组的长度来得到平均值。我编写了以下代码,但它给出了错误的结果:

public int findAvg(int a[], int n)
{
int sum,avg;
if(n==1)
 {

sum=a[0];
return sum;
}
else 
{
sum=a[n-1]+findAvg(a,n-1);
}

avg = sum/n;
return avg;}
类中调用findAvg方法:
public class main {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Recursive r = new Recursive ();
    int integersArr [] = {1,2,3,4,5};

    int max = r.findMax(integersArr,integersArr.length );
    int avg = r.findAvg(integersArr, integersArr.length);
    System.out.println("Maximum element = "+ max);
    System.out.println("Average value of elements = "+ avg);


 }

}

控制台输出:

元素的平均值 = 1

4个回答

2
首先,sum=a[n-1]+findAvg(a,n-1);是错误的,因为如果findAvg(a,n-1)返回前(n-1)个元素的正确平均值,则总和应该是a[n-1] + (n-1) * findAvg(a,n-1)
其次,在avg = sum/n;中整数相除时会损失精度,建议考虑使用双精度数。

1
public double average(int y[], int i) {
    double result;
    result = (double)y[i] / (double)y.length;
    if (i == 0)
        return result;
    else
        return result + average(y, i-1);
}

1
首先,整数的平均值可以是浮点数。因此,请将函数的返回类型设置为float或double。 现在, 如果您有一组n个数字,平均值为x,并且您想要向该组添加一个数字(称为b)。新的平均值将是((n * x) + b) / (n + 1)。在您的代码中使用相同的技巧。
public float findAvg(int a[], int n)
{
    float sum,avg;
    if(n==1)
    {
        sum=a[0];
    }
    else 
    {
        // Calculate sum of n-1 numbers = (n-1) * (avg of n-1 numbers)
        // and add nth number to it ( i.e. a[n-1])
        sum= a[n-1]+ (n-1) * findAvg(a,n-1);
    }
    avg = sum/n;
    return avg;
}

谢谢,我编辑了总和,以便递归调用每次返回的平均值是正确的。 - AMH9

0
public class main {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Recursive r = new Recursive ();
    int integersArr [] = {1,2,3,4,5};

    int max = r.findMax(integersArr,integersArr.length );
    int avg = r.findAvg(integersArr, integersArr.length);
    System.out.println("Maximum element = "+ max);
    System.out.println("Average value of elements = "+ avg);


 }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接