2013-11-01 2 views
0

Я создал метод вычисления чисел Фибоначчи итеративно (мне не разрешено использовать рекурсию). После 47 я получаю странные результаты:

Фибоначчи номер 47: -1323752223
Фибоначчи номер 48: 512559680
Фибоначчи номер 49: -811192543
число Фибоначчи 50: -298632863Итерационный метод Фибоначчи - java

Я пробовал разные способы, но он изменяет все это. Вот мой метод, любые идеи? Надеюсь, ты поможешь мне.

public static long fiboIterative(int n) { 

    if (n == 0) 
     return 0; 
    if (n == 1 || n == 2) 
     return 1; 

    int previous = -1; 
    int result = 1; 

    for (int i = 0; i <= n; i++) { 

     int sum = result + previous; 
     previous = result; 
     result = sum; 
    } 

    return result; 
    } 

}

+0

'int' являются 32-разрядными и не являются неограниченными. Вместо этого вы можете использовать 'double', но он также ограничен с точки зрения точности. Я предлагаю вам попробовать написать его, чтобы использовать «BigInteger» в качестве упражнения. –

ответ

8

Вы захлестнула int используется для хранения текущего числа Фибоначчи. Максимальное значение, которое может быть сохранено в int без переполнения, составляет чуть более 2 миллиардов. Integer.MAX_VALUE is 2147483647. Вы можете использовать больший тип данных, например long, для sum, previous и result, чтобы распечатать больше результатов. Тем не менее, это тоже в конечном итоге переполнится. Long.MAX_VALUE is 9223372036854775807, чуть более 9 квинтиллионов.

+1

[целочисленное переполнение объяснено] (http://pages.cs.wisc.edu/~willb/cs302/spring-07/why-integer-overflow-cl.pdf) | Попробуйте System.out.println (Integer.MAX_VALUE + 1 == Integer.MIN_VALUE); и убедитесь сами. – crownedzero

3

Вы получаете цельное переполнение.

Ваш результат - это номер, который не имеет возможности хранить ничего за пределами + 2^31, прибл.

Рассмотрите возможность использования BigInteger, в отличие от int или long.

4

Вы работаете в integer overflow: Тип Java int может представлять цифры между -2,147,483,648 и 2,147,483,647. 47-е число Фибоначчи - 2,971,215,073.

Изменить тип result, sum и previous к long, чтобы расширить диапазон до 90 чисел Фибоначчи.

Если вам нужно больше, изучите использование BigInteger.

Смежные вопросы