2010-12-18 89 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

正確的解決方案,使用迭代方法,並推出自己的堆棧。