***Error 太早了

Posted

技术标签:

【中文标题】***Error 太早了【英文标题】:***Error too early 【发布时间】:2016-04-13 07:39:58 【问题描述】:

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

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;' 【参考方案1】:

根据您的问题:

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

对于Why it is causing??的部分

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

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

举个简单的例子:

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

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

【讨论】:

以上是关于***Error 太早了的主要内容,如果未能解决你的问题,请参考以下文章

我的启动画面结束得太早了。如何在 Android 上手动隐藏启动画面?

台积电争夺汽车芯片AI芯片订单,春天来了,外媒:高兴得太早了

Javascript函数调用太快[重复]

Jquery - 延迟 mouseout 事件

Robolectric 和 Android SDK 29

linux--工具进阶