如何处理以java.lang.StackOverflowError结尾的深度递归



我得到了一个具有非常深的递归的程序,我确信它没有无限循环。但是在短时间(1s)之后,我得到了

java.lang.StackOverflowError

是否有可能增加他尝试结束程序的时间?如果可能的话,我想运行几个小时;-)

听起来你有一个错误。您可以使用-Xss增加堆大小,但听起来您希望将其增加到比计算机大小大得多。

我建议你减少你正在使用的递归量,这样如果可能的话,它只下降几十个级别。

进一步讨论减少递归/更改为迭代模式的评论,示例可能很有用。如果我们以阶乘函数为例,它可以递归地(并且通常是)这样写:

int recurse(int n){
    if(n = 0) return 1;
    else return n*recurse(n-1);
}

但是,它可以像这样迭代完成(因此避免为大 n 产生堆栈溢出)

int iterate(int n){
    int ans = 1;
    for(int i = n; i > 0; i--){
        ans *= i;
    }
    return ans;
}

可能值得做一些类似于你的代码的事情来避免递归(这可能是你的错误的原因),因为它(几乎?)总是可以使递归迭代

如本讨论中所述,您可以执行以下操作:

  • 使用运行时选项(java -Xssjava -Xoss选项)扩展堆栈的大小
  • 使用优化编译器来减少每一层的堆栈开销(给出的示例)

此外,您可以在 Java.exe 的 JDK 版本上尝试 -server 选项,因为它处理事情的方式略有不同。

但是,听起来您可能要求太多,需要为您正在做的事情找到不同的方法。

相关内容

  • 没有找到相关文章

最新更新