Проблема здесь в том, что только целые числа в Python имеют неограниченную длину, значения с плавающей запятой по-прежнему рассчитываются с использованием обычных типов IEEE с максимальной точностью.
Таким образом, поскольку вы используете аппроксимацию, используяВычисления с плавающей точкой, вы в конечном итоге получите эту проблему.
Вместо этого попробуйте вычислить последовательность Фибоначчи обычным способом, одно число (последовательности) за раз, пока не получите 1000 цифр.
есть.рассчитать 1, 1, 2, 3, 5, 8, 13, 21, 34 и т. д.
Под «обычным способом» я имею в виду следующее:
/ 1 , n < 3
Fib(n) = |
\ Fib(n-2) + Fib(n-1) , n >= 3
Обратите внимание, что «очевидный»«Подход с учетом приведенных выше формул не подходит для этой конкретной проблемы, поэтому я опубликую код для неправильного подхода, просто чтобы убедиться, что вы не тратите время на это:
def fib(n):
if n <= 3:
return 1
else:
return fib(n-2) + fib(n-1)
n = 1
while True:
f = fib(n)
if len(str(f)) >= 1000:
print("#%d: %d" % (n, f))
exit()
n += 1
На моей машине,приведенный выше код начинает работать действительно медленно около 30-го числа Фибоначчи, длина которого все еще составляет всего 6 цифр.
Я изменил рекурсивный подход, описанный выше, чтобы вывести количество вызовов функции fibдля каждого числа, и вот некоторые значения:
#1: 1
#10: 67
#20: 8361
#30: 1028457
#40: 126491971
Я могу показать, что первое число Фибоначчи с 1000 цифрами или более является 4782-м числом в последовательности (если я не просчитался), и поэтому числовызовы функции fib в рекурсивном подходе будут следующими:
И это всего лишь для 4782-го числа.Фактическое значение является суммой всех этих значений для всех чисел Фибоначчи от 1 до 4782. Нет никакого способа, которым это когда-либо завершится.
Фактически, если бы мы дали коду 1 год времени выполнения(упрощено до 365 дней), и, предполагая, что машина может совершать 10.000.000.000 вызовов каждую секунду, алгоритм получит до 83-го числа, которое по-прежнему всего 18 цифр.