用Java

时间:2016-01-29 19:00:33

标签: java arrays max min

所以我正在尝试编写一个递归算法,该算法可以找到数组的最小值和最大值。它基本上将数组拆分为两个n / 2块,并递归地找到最小值和最大值。这就是我现在所拥有的:

class MinMax{
    public static Pair mmA(int lb, int ub, int[] a){
        int min;
        int max;
        int mid;
        if (ub == lb){
            return mmA(lb, ub, a);
        } else {
            mid = (lb + ub)/2;
            mmA (lb, mid, a);
            max = mid;
            mmA (mid+1, ub, a);
            min = mid;

            if (a[max] > a[min]){
                return mmA(lb, max, a);
            } else 
                return mmA(min, ub, a);
        }
    }

    public static void main(String[]args){
        int[] a = {4, 3, 5, 6, 7, 9, 1};
        mmA(0, 6, a);
    }
}

问题是方法不是int方法所以我不能只说max = mmA(lb,mid,a)因为mmA是Pair方法而max是int。我也不能只生成Max和Min对对象,因为那样你最终无法比较它们。这是配对类:

class Pair {
   int alpha;   // the smaller one 
   int omega; // the bigger one 
   Pair ( int a, int o ) { alpha = a; omega = o; }
}

那么如何使用这个对类和我的方法来找到最小值和最大值。

4 个答案:

答案 0 :(得分:1)

你做不到。因为,这个函数最终将成为一个无结束的循环。

if (ub == lb){
    return mmA(lb, ub, a);
}

我们说ub = lb = 5。它会再次调用mmA(5, 5, a)。哪个将反过来调用相同的。等等..

编辑:

这应该有帮助,

public class Main {
    public static Pair mmA(int lb, int ub, int[] a) {
        int min, max, mid;
        Pair p1, p2;

        if (ub == lb) {
            return new Pair(a[lb], a[ub]);
        } else {
            mid = (lb + ub) / 2;
            p1 = mmA(lb, mid, a);
            p2 = mmA(mid + 1, ub, a);

            max = Math.max(p1.omega, p2.omega);
            min = Math.min(p1.alpha, p2.alpha);

            return new Pair(min, max);
        }
    }


    public static void main(String[] args) {
        int[] a = {4, 3, 5, 6, 7, 9, 1};
        Pair pair = mmA(0, 6, a);
        System.out.println("Max = " + pair.omega + " & Min = " + pair.alpha);
    }
}


class Pair {
    public int alpha;
    public int omega;

    Pair(int a, int o) {
        alpha = a;
        omega = o;
    }
}

答案 1 :(得分:1)

由于这似乎是一种递归练习,让我试着以这种借口引导你。

您的递归方法返回一对,即最小值和最大值。通过将数组拆分为两次,可以将其调用两次。到目前为止一切都很好。

现在您有两对(假设您更改代码以实际为变量分配返回值),您只需要组合它们。我们假设您的Pair类是不可变的,那么您可以像这样添加Pair方法:

public Pair combine(Pair other) {
    int newAlpha = Math.min(this.alpha, other.alpha);
    int newOmega = Math.max(this.omega, other.omega);
    return new Pair(newAlpha, newOmega);
}

注意:请注意,您的递归停止逻辑不起作用,如answer by Msp中所述。

答案 2 :(得分:1)

你需要Pair类的getter(或者公开alpha和omega属性):

class Pair {
   int alpha;   // the smaller one 
   int omega; // the bigger one 
   Pair ( int a, int o ) { alpha = a; omega = o; }
   getAlpha () { return alpha; }
   getOmega () { return omega; }
}

你必须停止在基本情况下返回一个Pair的递归(lb = ub)

class MinMax{
    public static Pair mmA(int lb, int ub, int[] a){
        int min;
        int max;
        int mid;
        Pair pair1;
        Pair pair2;

        if (ub == lb){
            // Just one item, so min and max are the same
            return Pair(a[lb],a[ub]);
        } else {
            mid = (lb + ub)/2;
            pair1 = mmA (lb, mid, a);                
            pair2 = mmA (mid+1, ub, a);

            min = Math.min(pair1.getOmega(), pair2.getOmega());
            max = Math.max(pair1.getAlpha(), pair2.getAlpha());

            return new Pair(min, max);
        }
    }

    public static void main(String[]args){
        int[] a = {4, 3, 5, 6, 7, 9, 1};
        mmA(0, 6, a);
    }
}

答案 3 :(得分:0)

问题似乎是你从来没有真正归还过任何东西,正如@Andreas所说的那样,你没有把你所返回的结果合并起来。

这里我必须为上部索引和下部索引相邻(即上部 - 下部= 1)添加额外条件,否则将发生无限循环。此外,我更改了您的变量名称以使其更具描述性。我发现自己迷失了它。

public class MinMax {

    public static void main(String[] args){
        int[] array = {4, 3, 5, 6, 7, 9, 1};
        Pair result = mmA(0, array.length - 1, array);
        System.out.println("min: " + result.alpha + ", max: " + result.omega);
    }

    public static Pair mmA(int lowerBound, int upperBound, int[] array){
        if (upperBound == lowerBound){
            return new Pair(array[lowerBound], array[upperBound]);
        }
        else if (upperBound - lowerBound == 1) {
            int localAlpha = Math.min(array[lowerBound], array[upperBound]);
            int localOmega= Math.max(array[lowerBound], array[upperBound]);
            return new Pair(localAlpha, localOmega);
        }
        else {
            int midIndex = (lowerBound + upperBound)/2;
            Pair pairA = mmA(lowerBound, midIndex, array);
            Pair pairB = mmA(midIndex, upperBound, array);
            int localAlpha = Math.min(pairA.alpha, pairB.alpha);
            int localOmega= Math.max(pairA.omega, pairB.omega);
            return new Pair(localAlpha, localOmega);
        }
    }

}

class Pair {
    int alpha;   // the smaller one
    int omega; // the bigger one
    Pair ( int alpha, int omega ) {
        this.alpha = alpha;
        this.omega = omega;
    }
}