Ряд чисел Фибоначчи представляет собой последовательность. Первый и второй элементы последовательности равны единице. Каждый последующий элемент равен сумме двух предыдущих. Рассмотрим разные способы нахождения элементов по номеру и генерацию списка с помощью 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
мы получаем поочередно числа ряда.