Алгоритм вычисления последовательности Фибоначчи, реализованный в Java, дает странный результат
Когда я запускаю Countdown.class, я получаю следующий вывод:
263845041
-1236909152
-973064111
2084994033
1111929922
-1098043341
13886581
-1084156760
-1070270179
2140540357
Взлетать!
Числа перед "Взрыв!" должны быть первые 10 чисел Фибоначчи. Мой исходный код выглядит следующим образом.
public class Fibonacci {
public static long fib(int n) {
if (n <= 1) return 1;
return fib(n-1) + fib(n-2);
}
public static long fastfib(int n) {
int a = 0;
int b = 1;
int c = 0;
for (int i = 0; i <= n; n++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
и класс, который реализует метод fastfib:
public class Countdown {
public static void countdown(int n) {
if (n == 0) System.out.println("Blast Off!");
else {
System.out.println(Fibonacci.fastfib(n));
countdown(n - 1);
}
}
public static void main(String[] args) {
countdown(10);
}
}
4 ответа
Хоть твой fastfib()
метод возвращает long
, расчеты сделаны на int
s.
Вы столкнулись с целочисленным переполнением.
Убедитесь, что объявили a,b,c
как long
а не как int
s. Если вы хотите еще большие числа (которые находятся за пределами диапазона long
s также) - вы можете посмотреть на BigInteger
(и используйте это).
РЕДАКТИРОВАТЬ: Как упомянуто @ExtremeCoders в комментарии, есть еще одна проблема в коде в вашем for
цикл: for (int i = 0; i <= n; n++)
должно быть for (int i = 0; i <= n; i++)
хочешь увеличить i
- нет n
,
В дополнение к другим ответам,
for (int i = 0; i <= n; n++) {
должно быть
for (int i = 0; i <= n; i++) {
// ^ that's an i
Измените типы данных a,b и c на long, и он начнет работать нормально. Ваши номера выходят за пределы для инт.
Вы должны использовать BigInteger долго
импорт java.math.BigInteger;
открытый класс Фибоначчи {
public static BigInteger fib(BigInteger n) {
int result = n.compareTo(BigInteger.valueOf(1)); // returns -1, 0 or 1 as this BigInteger is numerically less than, equal to, or greater than val.
if (result != 1) return BigInteger.valueOf(1);
return fib(
n.subtract(
BigInteger.valueOf(1).add
(n.subtract
(
BigInteger.valueOf(-2)
)
)
)
);
}
public static BigInteger fastfib(int n) {
BigInteger a = BigInteger.valueOf(0);
BigInteger b = BigInteger.valueOf(1);
BigInteger c = BigInteger.valueOf(0);
for (int i = 1; i < n; i++) {
c = a.add(b);
a = b;
b = c;
}
return c;
}
}