所以我正在尝试编写一个递归算法,该算法可以找到数组的最小值和最大值。它基本上将数组拆分为两个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; }
}
那么如何使用这个对类和我的方法来找到最小值和最大值。
答案 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;
}
}