2010-12-18 5 views
0

は、私を助けてくださいおかげ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) 

EDITED:それが印刷されます:

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'はどこから来ていますか? –

+0

kはグローバル変数です! – user472221

+0

StackOverflowExceptionを引き起こす行の上にi、k、jを出力するログメッセージを追加してください。 –

答えて

7

recursive methodと書いてあります。ベースケースに到達することで終了することを確認する必要があります。そうでなければ、スタックオーバーフロー例外が発生するまでループに入る可能性があります。これはここで起きています。終了を保証する最も簡単な方法は、いつでもすべての通話でベースケースに近づけることです。ここでの基本的なケースは、ある時点でijという引数が等しくなっている必要があるため、各ステップで少なくとも1つは互いに接近させてください。ここで

は、問題を与える行です:

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

これはちょうど、繰り返し同じ値を使用してメソッドを呼び出すために起こっています。 k + 1k - 1ではなく、i + 1j - 1を意味していませんか?

+0

kはグローバル変数です! – user472221

+0

@ user472221:あなたは 'k'の値を変更していません - 関数' fillMinAverageTimeArray'を 'i'と' k-1'と同じ値で何度も何度も呼び出しています。あなたは決して進歩しません。再帰関数の中で 'i'と' j'の値を出力するいくつかのデバッグ行を追加してみてください。 –

+0

あなたは正しいですが、私のk値をメソッドにどのように送ることができますか? – user472221

1

Markは既に述べたように、再帰呼び出しが正しく終了することを確認します。

まだオーバーフローしている場合、再帰は単純に深いです。

Hackyソリューションでは、change the stack sizeにJVMの-Xssフラグを使用します。

解決策を訂正し、反復アプローチを使用して独自のスタックをロールバックします。

関連する問題