【问题标题】:What is the reason of java.lang.StackOverflowError with proper termination condition? [duplicate]具有适当终止条件的 java.lang.StackOverflowError 的原因是什么? [复制]
【发布时间】:2019-06-16 19:47:19
【问题描述】:

hacker earth 上也有类似的编码问题。挑战现在结束。我现在没有这个问题,但我的代码看起来像这样。我通过了测试用例,但由于输入过多而导致我的代码不被接受,这会导致此错误。 我写了以下代码。

import java.util.*;
class TripleStep{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=10000;
        long[] memo=new long[n+1];
        Arrays.fill(memo,-1);
        long ans=StairOpr(n,memo);
        Arrays.fill(memo,-1);
        System.out.println(ans);
    }
    public static long StairOpr(int n,long[] memo){
        if(n<0){
            return 0;
        }
        else if(n==0){
            return 1;
        }
        else if(n==1){
            return 2;
        }

        else if(n==2){
            return 3;
        }
        else if(memo[n]>-1){
            return memo[n];
        }
        else
            memo[n]= (StairOpr(n-1,memo)%1000000007+StairOpr(n-2,memo)%1000000007+StairOpr(n-3,memo)%1000000007+n*n*(n+1)%1000000007)%1000000007;
            return memo[n];
    }
}

对于输入值 10000,代码给了我以下错误。

Exception in thread "main" java.lang.StackOverflowError
    at TripleStep.StairOpr(TripleStep.java:31)
    at TripleStep.StairOpr(TripleStep.java:31)

原因是什么,解决办法是什么?由于我编写了动态编程代码,但由于错误,答案未提交,我面临拒绝。

【问题讨论】:

  • 这个%1000000007 应该做什么?你输入什么值作为n
  • 结果应该是1000000007的模数,输入值为10000
  • 是的,我知道% 做了什么,但是期望得到什么值来证明这一点?为什么你希望你的内存支持 10000 次递归方法调用?您是否正确配置了堆栈?
  • 显然没有,或者你不会在这里问这个问题。它甚至没有那么难。由于输入值较大,您的代码执行了过多的递归调用。你不能用递归做所有事情,所以是时候使用不同的方法了。
  • 也许可以用这个 long[] dp=new long[n+1]; dp[0]=1; dp[1]=2; dp[2]=3; for(int i=3;i

标签: java algorithm data-structures stack dynamic-programming


【解决方案1】:

您的递归函数正在创建一个大堆栈,这意味着您的函数一次又一次地调用自己,超出了您的内存空间可以处理的范围。

请描述您要解决的问题是什么。

【讨论】:

  • hacker earth 上有一个类似的编码问题。挑战现在结束。我现在没有这个问题,但我的代码看起来像这样。我通过了测试用例,但由于输入量大而导致我的代码不被接受会出现此错误。
  • 您的代码有停止条件,但是在到达它之前,您的堆栈变得太大(溢出)并抛出 StackOVerflowError。我不完全了解您的代码的作用,但尝试用循环条件(如果可能)替换递归调用以节省空间解决问题。如果你能描述你的代码应该做什么,也许我们可以考虑一个有效的解决方案并创建一个更好的代码。
  • 是的,我认为这个问题应该只通过迭代来解决。
  • 也许可以用这个 long[] dp=new long[n+1]; dp[0]=1; dp[1]=2; dp[2]=3; for(int i=3;i
猜你喜欢
  • 2010-12-04
  • 2022-11-21
  • 2019-07-09
  • 1970-01-01
  • 2021-01-26
  • 2017-06-21
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多