【问题标题】:StackOverflowError too earlyStackOverflowError 太早了
【发布时间】:2016-04-13 07:39:58
【问题描述】:

每当我给数组的size 多于3 时,我的程序都会给我StackOverflowError

package database;

import java.util.Scanner;

public class The_Maximum_Subarray {
    int a[];

    public The_Maximum_Subarray(int size) {
        a=new int[size];
    }

    public int maxsubArray(int[] a,int li,int ui)
    {  
        if(ui ==li)
            return a[li];

        int m=(ui-li)/2;
        int leftMaxSubarray=maxsubArray(a, li, m);
        int rightMaxSubarray=maxsubArray(a, m+1, ui);
        int leftSum=0,rightSum=0,sum=0;

        for(int i=m;i>=li;i--)
        {
            sum+=a[i];
            if(sum>leftSum)
                leftSum=sum;
        }

        sum=0;
        for(int i=m+1;i<=ui;i++)
        {
            sum+=a[i];
            if(sum>rightSum)
                rightSum=sum;
        }
        sum=leftSum+rightSum;

        if(rightMaxSubarray>=leftMaxSubarray && rightMaxSubarray>=sum)
            return rightSum;
        else if(leftMaxSubarray>=rightMaxSubarray && leftMaxSubarray>=sum)
            return leftSum;
        else
            return sum;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);   
        int size=sc.nextInt();
        The_Maximum_Subarray obj=new The_Maximum_Subarray(size);

         for(int j=0;j<size;j++)
             obj.a[j]=sc.nextInt(); 
         System.out.println(obj.maxsubArray(obj.a, 0, size-1)); 
    }
}

谁能告诉我为什么它给我这个小尺寸数组的例外?

【问题讨论】:

  • 因为你有一个无限深的递归,所以设置一个断点并调试你的代码,逐行遍历maxsubArray
  • 看看this
  • 您似乎正在使用递归和循环的组合。此外,如果您从一个包含给定点的所有总和的数组开始并找到两个值之间的最大差值,则可以更有效地执行此操作。
  • 顺便说一句,您可以在单遍循环中执行此操作而无需递归。我会考虑如何简化这一点。这似乎不是基于快速排序或合并排序。
  • 感谢您的回复,这实际上是 kadanes algo..我的代码中的错误在 'int m=(ui-li)/2;' 行中它应该是 'int m=(ui-li)/2+li;'

标签: java arrays stack-overflow


【解决方案1】:

根据您的问题:

谁能告诉我为什么它给了我这个小数组的例外?

对于Why it is causing??的部分

根据java.lang.StackOverflowErrorjava 语言规范,当应用程序递归太深时会出现此错误。

此递归导致堆栈填充,并试图超出堆栈的限制Xs

举个简单的例子:

class StackOverflowDemo {
    private void causeOverflow(int i) {
        causeOverflow(i);
        System.out.println(i);
    }
    public static void main(String args[]) {
        StackOverflowDemo demo =  new StackOverflowDemo();
        demo.causeOverflow(5);
    }
}

这里,System.out.println(i) 将被递归调用,即当它被调用时它会被压入堆栈。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多