Это контекст моей программы.
Функция имеет 50% шанс ничего не делать, 50% для вызова себя дважды. Какова вероятность завершения программы?
Я написал этот фрагмент кода, и он отлично работает. Ответ, который не может быть очевидным для всех, заключается в том, что эта программа имеет 100% шанс закончить. Но есть StackOverflowError (как удобно;)), когда я запускаю эту программу, происходящую в Math.Random(). Может ли кто-нибудь указать мне, откуда он взялся, и сказать мне, может быть, мой код неправильный?
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)
. Я подозреваю, что стек и количество функций в нем ограничено, но я действительно не вижу здесь проблемы.
Любые советы или подсказки, безусловно, приветствуются.
Фабьен
EDIT: Спасибо за ваши ответы, я запустил его с java -Xss4m, и он отлично работал.