Java HW StackOverflow错误,从书中复制了Max Subarray伪代码



我正试图用直接从我的书中复制的伪代码来实现递归Max Subarray问题。我不明白为什么在1次递归之后会出现StackOverFlow问题。这是我的密码。

 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;
    }
 }

我传入一个从文本文件读取的2000 int的ArrayList。我也试着把它们存储在一个普通的数组中,但仍然得到了同样的错误,所以这和它无关

我在第一行收到StackOverFlow错误:

 if(low==high)

然后在线

int leftSum= DivideAndConquerMaxSub(ar, low, mid);

在DivideAndConquerMaxSub方法中。

我的打印输出:

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
查看是否修复

最新更新