0

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

java.lang.StackOverflowError

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

4

3 回答 3

3

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

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

于 2012-08-09T09:23:39.017 回答
0

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

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

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

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

于 2012-08-09T09:30:29.170 回答
0

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

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;

}

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

于 2012-08-09T09:33:47.760 回答