stackoverflowException

时间:2010-12-18 14:10:45

标签: java exception stack-overflow

我已经编写了下面的代码。但是它会打印出这个异常,我真的不知道它有什么问题,请帮帮我谢谢

CODE:

    private void fillMinAverageTime() {   //T(n) = O(n^3)
    for (int i = list.size() - 2; i >= 0; i--) {
        for (int j = i + 1; j < list.size(); j++) {
            for (k = i; k <= j; k++) {
                minOne = fillMinAverageTimeArray(i, j);
                if (min == 0.0) {
                    min = minOne;
                } else if (minOne < min) {
                    min = minOne;
                }
            }
            min = 0.0;
            minOne = 0.0;
            minAverageTimeArray[i][j] = min + probability[i][j];


        }

    }
}

private double fillMinAverageTimeArray(int i, int j) {
    if (i > j) {
        return 0.0;
    }
    if (i == j) {
        return minAverageTimeArray[i][i];
    }
   System.out.println(k+","+j+","+i);//EDITED

 **return (fillMinAverageTimeArray(i, k - 1) + fillMinAverageTimeArray(k + 1, j));**//the line tat throws this exception
}

例外:

at OBST.MemoizedVersion.fillMinAverageTimeArray(MemoizedVersion.java:118)
at OBST.MemoizedVersion.fillMinAverageTimeArray(MemoizedVersion.java:118)
at OBST.MemoizedVersion.fillMinAverageTimeArray(MemoizedVersion.java:118)

已编辑:将打印:

2,3,2
3,3,2
1,2,1
2,2,1
1,3,1
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2
1,3,2

2 个答案:

答案 0 :(得分:7)

您已撰写recursive method。您必须确保它将通过到达基本情况来终止,否则它可能会进入循环直到发生堆栈溢出异常 - 这就是这里发生的事情。保证终止的最简单方法是始终确保您在每次通话时更接近基本情况。你的基本情况是,ij在某些时候必须相等,所以你应该尝试在每一步都让它们至少相互靠近。

以下是解决问题的方法:

return (fillMinAverageTimeArray(i, k - 1) + fillMinAverageTimeArray(k + 1, j));

这只是重复调用相同值的方法。您确定不是i + 1j - 1而不是k + 1k - 1吗?

答案 1 :(得分:1)

正如Mark已经说过,请确保您的递归调用正确终止。

如果它仍然溢出,那么你的递归就是深度。

Hacky解决方案,使用JVM的-Xss标志change the stack size

正确的解决方案,使用迭代方法并滚动自己的堆栈。

相关问题