我已经编写了下面的代码。但是它会打印出这个异常,我真的不知道它有什么问题,请帮帮我谢谢
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
答案 0 :(得分:7)
您已撰写recursive method。您必须确保它将通过到达基本情况来终止,否则它可能会进入循环直到发生堆栈溢出异常 - 这就是这里发生的事情。保证终止的最简单方法是始终确保您在每次通话时更接近基本情况。你的基本情况是,i
和j
在某些时候必须相等,所以你应该尝试在每一步都让它们至少相互靠近。
以下是解决问题的方法:
return (fillMinAverageTimeArray(i, k - 1) + fillMinAverageTimeArray(k + 1, j));
这只是重复调用相同值的方法。您确定不是i + 1
和j - 1
而不是k + 1
和k - 1
吗?
答案 1 :(得分:1)
正如Mark已经说过,请确保您的递归调用正确终止。
如果它仍然溢出,那么你的递归就是深度。
Hacky解决方案,使用JVM的-Xss
标志change the stack size。
正确的解决方案,使用迭代方法并滚动自己的堆栈。