2012-04-09 9 views
14

私は約5000回まで自分自身を呼び出す関数を書いています。もちろん、私はStackOverflowExceptionを取得します。私はかなり簡単な方法?:ところでJava:回避する方法StackOverflowException

void checkBlocks(Block b, int amm) { 

    //Stuff that might issue a return call 

    Block blockDown = (Block) b.getRelative(BlockFace.DOWN); 
    if (condition) 
     checkBlocks(blockDown, amm); 


    Block blockUp = (Block) b.getRelative(BlockFace.UP); 
    if (condition) 
     checkBlocks(blockUp, amm); 

    //Same code 4 more times for each side 

} 

にこのコードを書き換えることができますどのような方法がありますが、私たちは関数を呼び出すことができますどのように深いの制限は何ですか?

ありがとうございます!

+0

http://stackoverflow.com/questions/214741/what-is(私は解決策に近づく各ステップ(この事実の私の再帰アンカー)まで)は、n-1であります-a-stack-overflow-error –

答えて

17

多分スタックを使用していますか?

void checkBlocks(Block b, int amm) { 
    Stack<Block> blocks = new Stack<Block>(); 
    blocks.push(b); 
    while (!blocks.isEmpty()) { 
    b = blocks.pop(); 
    Block blockDown = (Block) b.getRelative(BlockFace.DOWN); 
    if (condition) 
     blocks.push(block); 
    Block blockUp = (Block) b.getRelative(BlockFace.UP); 
    if (condition) 
     blocks.push(block); 
    } 
} 
+0

ありがとう、うまくいきます。そのクラスはおそらく後でもっと便利になるはずです。タイ! –

0

-Xss4mを使用すると、スタックサイズを増やすことができます。

+0

しかし、ボードのサイズが増え続けるのはどうですか?私は彼がこれを認識し、スタックサイズを増やす方法を尋ねなかったと思いますが、コードをどのようにリファクタリングするのですか? – barsju

0

"ブロック"をキュー/スタックに入れて、ブロックが利用可能である限り繰り返すことができます。

0

あなたの再帰のような分岐要因でStackOverflowを取得することは明らかです。他の言語では、それは達成することができますby Tail Call Optimization。しかし、私はあなたの問題が解決する別の方法を必要とすると思います。

理想的には、ブロックをチェックします。たぶん、あなたはすべてのブロックのリストを取得し、それらを繰り返しチェックすることができますか?

4

デフォルトのスタックサイズは512kbです。あなたは、プログラムがStackOverflowExceptionが

を投げて終了することを超えた場合は、JVM引数を渡すことにより、スタックサイズを増やすことができます。 -Xss1024k

は今、サイズが1024キロバイトでスタック。あなたが

ご使用の環境に基づいて

をより高い値を与える可能性があり、私たちはプログラムで再帰が間違った方法で使用されているほとんどの場合、この

0

を変更することができるとは思いません。スタックオーバーフロー例外は発生しません。 メソッドに戻り値の型/値はありません。 最初のブロックbが有効であることをどのようにして保証しますか?

  • 私の再帰アンカー(私は再帰を停止しない)
  • は私の再帰ステップが何であるか(どのように私は私の数を減らすかが何であるか:あなたは再帰を使用している場合

    することは、自分自身に次の質問に答えます

    • N:

    例)計算の! => n * n-1!

私の再帰アンカーはn == 2(結果は2)なので、このアンカーから始まるすべての結果を計算できます。

私の再帰ステップが

関連する問題