Я знаю, что есть много уже существующих вопросов об этой проблеме, но я не нашел ничего, что отвечало бы на мой. Моя рекурсия отлично работает для более низких чисел (я пробовал int 10), но когда я расширяю ее до 100, она становится ровно на один шаг ниже, чем должна. Не уверен, почему.
Мой код:
public BigDecimal distinctLadderPaths(int rungs) {
if (rungs < 0)
throw new ArithmeticException("Ladders can't have negative rungs."); // if negative, throw exception
else if (rungs == 0)
return BigDecimal.valueOf(0); //if zero, return zero
else if (rungs <= 2)
return BigDecimal.valueOf(rungs); //if 1 or 2, return 1 or 2, respectively
else{
long[] f = new long[(rungs + 1)]; //create long Array for memory (f for fibonacci)
f[0] = 0; //1 steps
f[1] = 1; //2 steps
for(int i = 2; i <= rungs; i++) { //loop
f[i] = f[i - 1] + f[i - 2]; //at each step in the loop, add 1 step lower and 2 steps lower from the number of iterations
}
return BigDecimal.valueOf(f[rungs]); //return fibonacci value at final step of the rungs as BigDecimal
}
}
тестовый код:
@Test
public void testDistinctLadderPaths100 (){
int rungs = 100;
BigDecimal expected = new BigDecimal("573147844013817084101");
BigDecimal result = lp.distinctLadderPaths(rungs);
assertEquals(expected, result);
}
Мне сказали, что результат должен быть 57314784401381708410
, но я получение 3736710778780434371
(число Фибоначчи на 99-м шаге). Есть идеи, почему?