使用分而治之的整数序列的平均值

时间:2016-06-15 13:05:15

标签: java algorithm divide-and-conquer

给定一系列整数,如何使用分而治之的方法找到它的平均值?我必须写一个方法" double avg(int [] a,int l,int r)"找到数组A中的平均值,从' l'到了' r'作为家庭作业,但我在第一次递归调用时得到了StackOverflowError - 尽管不是第二次! - 我的代码,我似乎无法理解为什么。另外,我很确定它并没有给我一个真正的平均值,但是我发现没有办法用分而治之的方法检查一个序列的平均值。这是我的代码:

public class Average {
public static void main(String[] args) {

    int[] A = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
    int l = 0;
    int r = A.length-1;
    System.out.println("Average of the array: "+averageCheck(A, l, r));

}

public static double averageCheck(int[] A, int l, int r) {
    if (l==r) {
        return A[l];
    }
    // Base Case: if there's just a single element it is the average of the array itself

    int mid = (l+r)/2;
    double avLeft = 0;
    double avRight = 0;

    avLeft = A[l]/r + averageCheck(A, l, mid);
    avRight = A[mid+1]/r + averageCheck(A, mid+2, r);

    double average = ( (avLeft*mid) + (avRight * (r-mid) ) ) /r;

    return average;

    }
}

1 个答案:

答案 0 :(得分:1)

r == l + 1时,您的递归不会结束。在这种情况下,mid == l和第二次递归调用中,mid+2将大于r。在函数的开头添加:

if(l > r)
       return 0;

示例,假设l == 5r == 6,然后mid将具有值5.第二个调用将是averageCheck(A, 7, 6),因为mid+2是7。此次调用,条件l == r将为false。继续使用相同的逻辑,你会发现递归不会结束。

我认为如果你递归地计算总和并除以最后的长度会更好。

我建议这个解决方案:

public class Average {
public static void main(String[] args) {

    int[] A = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
    System.out.println("Average of the array: "+average(A));

}

public static double average (int[] A) {
       return averageCheck(A, 0, A.length - 1) / A.length;
}

public static double averageCheck(int[] A, int l, int r) {

if (l > r)
    return 0;

if (l==r) {
    return A[l];
}
// Base Case: if there's just a single element it is the average of the array itself

int mid = (l+r)/2;
double avLeft = 0;
double avRight = 0;

avLeft = averageCheck(A, l, mid);
avRight = averageCheck(A, mid+1, r);

double average = avLeft + avRight;

return average;

}
}