2010-12-18 31 views
0

我写代码below.but将打印此异常,我真的不知道什么是它的问题,请帮我谢谢stackoverflowException

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

该方法中的“k”来自哪里? – 2010-12-18 14:18:18

+0

k是一个全局变量! – user472221 2010-12-18 14:45:17

+0

请在打印出导致StackOverflowException的行上方的i,k,j处添加日志消息。 – 2010-12-18 14:47:43

回答

7

您已写下recursive method。您必须确定它会通过到达基本情况而终止,否则它可能会进入循环,直到发生堆栈溢出异常 - 这就是发生的情况。确保终止的最简单方法是始终确保您在每次通话时更接近您的基本情况。这里的基本情况是,参数ij在某个时刻必须平等,所以你应该尽量让他们在每一步都至少相互靠近一点。

下面是给出了问题的行:

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

这只是要反复用相同的价值观打电话给你的方法。你确定你不是指i + 1j - 1而不是k + 1k - 1

+0

k是一个全局变量! – user472221 2010-12-18 14:46:11

+0

@ user472221:你没有改变'k'的值 - 你只是用相同的值'i'和'k-1'反复调用函数'fillMinAverageTimeArray'。你从来没有取得任何进展。尝试添加一些调试行,在递归函数内输出“i”和“j”的值,你应该看到问题 - 它们永远不会改变。 – 2010-12-18 14:53:55

+0

你是对的,但我怎样才能发送我的K值的方法? – user472221 2010-12-18 14:59:11

1

正如Mark所说的,确保您的递归调用正确终止。

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

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

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