これが私のプログラムのコンテキストです。
関数は 50% の確率で何も実行せず、50% の確率で自分自身を 2 回呼び出します。プログラムが終了する確率は?
私はこのコードを書きましたが、明らかにうまく機能します。誰にとっても明らかではないかもしれない答えは、このプログラムは 100% の確率で終了するということです。しかし、このプログラムを実行すると、Math.Random() で発生する StackOverflowError (なんて便利な ;) ) があります。誰かが私にそれがどこから来たのかを指摘して、私のコードが間違っているかどうか教えてもらえますか?
static int bestDepth =0;
static int numberOfPrograms =0;
@Test
public void testProba(){
for(int i = 0; i <1000; i++){
long time = System.currentTimeMillis();
bestDepth = 0;
numberOfPrograms = 0;
loop(0);
LOGGER.info("Best depth:"+ bestDepth +" in "+(System.currentTimeMillis()-time)+"ms");
}
}
public boolean loop(int depth){
numberOfPrograms++;
if(depth> bestDepth){
bestDepth = depth;
}
if(proba()){
return true;
}
else{
return loop(depth + 1) && loop(depth + 1);
}
}
public boolean proba(){
return Math.random()>0.5;
}
.
java.lang.StackOverflowError
at java.util.Random.nextDouble(Random.java:394)
at java.lang.Math.random(Math.java:695)
. スタックとその中の関数の量が限られているのではないかと思いますが、実際には問題はありません。
アドバイスや手がかりはもちろん大歓迎です。
ファビアン
編集: ご回答ありがとうございます。 java -Xss4m で実行しましたが、うまくいきました。