Ряд чисел Фибоначчи представляет собой последовательность. Первый и второй элементы последовательности равны единице. Каждый последующий элемент равен сумме двух предыдущих. Рассмотрим разные способы нахождения элементов по номеру и генерацию списка с помощью Python 3.
Введение
Расчет ряда чисел Фибонначчи – один из лучших примеров программ на Python, использующих рекурсию. Хотя наиболее частый пример, рекурсии – это расчет факториала.
Рассмотрим варианты получения ряда Фибоначчи на Python 3:
- С помощью рекурсии.
- Используя оператор цикла.
Также сгенерируем список чисел и создадим генератор с помощью которого можно поочередно получать числа.
Цикл
Будем искать с помощью цикла for. В переменных prew и cur будут предыдущий элемент последовательности и текущий, их проинициализируем в 1. Если пользователь запросит первый или второй элемент, то мы так и не попадём внутрь тела цикла. И будет выведена единица из переменной cur.
Если же запросят 3-ий или какой либо последующий элемент последовательности Фибоначчи, то мы зайдем в цикл. Во временную переменную tmp сохраним следующее число последовательности. После этого заполним prew и cur новыми значениям. Когда пройдет нужное количество итераций, выведем значение cur в консоль.
prew = cur = 1
element = input('Введите номер искомого элемента : ')
element = int(element)
for n in range(int(element-2)):
tmp = prew + cur
prew = cur
cur = tmp
print(str(element)+' элемент последовательности равен ' + str(cur))
Введите номер искомого элемента : 6
6 элемент последовательности равен 8
В предыдущем коде нам пришлось воспользоваться переменной tmp. Но можно код внутри цикла переписать следующим образом:
prew, cur = cur, prew + cur
Теперь вместо трех строк кода получилась одна строка! И пропала необходимость использования дополнительной переменной.
В этом примере мы использовали цикл for, но можно эту программу реализовать, немного изменив код, с помощью цикла while.
Рекурсия
В случае с рекурсией напишем функцию, аргументом которой будет требуемое число ряда Фибоначчи. Текущему значению последовательности cur вначале присвоим 1. После этого воспользуемся условным оператором языка Python – if. В нем проверим аргумент функции. Если он больше 2, то функция вызовет саму себя и вычислит предыдущее значение ряда, а так же то, которое было еще раньше и запишет в переменную cur их сумму.
def fibonacci(n):
cur = 1
if n > 2:
cur = fibonacci(n-1) + fibonacci(n-2)
return cur
element = input('Введите номер искомого элемента : ')
element = int(element)
value = fibonacci(element)
print(str(element)+' элемент последовательности равен ' + str(value))
Конечно, пример с рекурсией интересен. Но он будет работать гораздо медленнее.
А если вы решите вычислить, допустим 1000-ый элемент последовательности. Используя цикл, мы его очень быстро рассчитаем. А вот в случае с рекурсией получим ошибку превышения максимального количества рекурсий:
RecursionError: maximum recursion depth exceeded in comparison
Генератор списка
Если мы захотим инициализировать список рядом Фибоначчи, то это можно сделать следующим образом:
def fibonacci(n):
a, b = 1, 1
for i in range(n):
yield a
a, b = b, a + b
data = list(fibonacci(10))
print(data)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
Здесь fibonacci(10) это генератор объекта ряда размерностью 10. При каждом последующем вызове он будет с помощью yield возвращать очередной элемент. Мы создаём из него список. Затем выводим список в консоль с помощью функции print.
Если нам надо будет поочередно получать числа ряда, а не держать в памяти сразу весь список, то можно поступить следующим образом:
def fibonacci():
a, b = 1, 1
while True:
yield a
a, b = b, a + b
gen = fibonacci()
for i in range(5):
print(next(gen))
1
1
2
3
5
Здесь мы создали с помощью Python 3 генератор чисел Фибоначчи. При помощи функции next мы получаем поочередно числа ряда.
Все о Python