Java HW StackOverflower错误,最大子数组伪代码复制自书本
我试图用直接从我的书中复制的伪代码实现一个递归的最大子数组问题。我不明白为什么我在1次递归后遇到堆栈溢出问题。这是我的密码Java HW StackOverflower错误,最大子数组伪代码复制自书本,java,stack-overflow,Java,Stack Overflow,我试图用直接从我的书中复制的伪代码实现一个递归的最大子数组问题。我不明白为什么我在1次递归后遇到堆栈溢出问题。这是我的密码 public class MaxSub { public int FindMaxCrossingSubArray(ArrayList<Integer> ar, int low, int mid, int high) { int maxLeft=0; int leftSum=Integer.MIN_VALUE;
public class MaxSub {
public int FindMaxCrossingSubArray(ArrayList<Integer> ar, int low, int mid, int high)
{
int maxLeft=0;
int leftSum=Integer.MIN_VALUE;
int sum=0;
for(int i=mid; i>low; i--){
sum= sum + ar.get(i);
if(sum>leftSum){
leftSum=sum;
maxLeft=i;// counter
}
}
int rightSum=Integer.MIN_VALUE;
sum=0;
int MaxRight=0;
for(int j=mid+1; j<=high; j++){
sum=sum+ar.get(j);
if(sum>rightSum){
rightSum=sum;
MaxRight=j;
}
}
System.out.println(maxLeft+MaxRight +"max crossing method");
return maxLeft+MaxRight;
}
public int DivideAndConquerMaxSub(ArrayList<Integer> ar, int low, int high){
if(low==high)//StackOverFlowError
return 0;
else {
int mid=(low+high/2);
int leftSum= DivideAndConquerMaxSub(ar, low, mid);//StackOverFlowError
int rightSum= DivideAndConquerMaxSub(ar, mid+1, high);
int crossSum= FindMaxCrossingSubArray(ar, low, mid, high);
System.out.println(crossSum+ "divide method");
if(leftSum>=rightSum &&leftSum>=crossSum )
return leftSum;
else if (rightSum>=leftSum&&rightSum>=crossSum)
return rightSum;
else
System.out.println(crossSum+ "t");
return crossSum;
}
}
然后在线
int leftSum= DivideAndConquerMaxSub(ar, low, mid);
在divideandconvertedmaxsub方法中
我的打印输出:
low : 0
high : 2000
1max crossing method
1divide method
1t
Exception in thread "main" java.lang.StackOverflowError
at MaxSub.DivideAndConquerMaxSub(MaxSub.java:54)
at MaxSub.DivideAndConquerMaxSub(MaxSub.java:61)
at MaxSub.DivideAndConquerMaxSub(MaxSub.java:61)
at MaxSub.DivideAndConquerMaxSub(MaxSub.java:61) and so on.
此行:int mid=(低+高/2);这是错误的。它应该是int-mid=(低+高)/2;看看这是否解决了问题@Makoto不确定Makoto是否愿意发表评论?我肯定看到了其他东西,但我现在没有看到任何其他东西。很抱歉。 int mid = (low + high) / 2; int mid=(low+high/2); int mid = (low + high) / 2;