Close

Итеративно, рекурсивно, генеративно …

В этой статье я поделюсь несколькими способами решения на языке python одной классической математической задачи — получения чисел последовательности Фибонначи.

В 12-13 вв в Европе жил математик Леонардо Пизанский, более известный как Фибоначчи. Как-то на досуге он задумался о скорости размножения кроликов и, пронаблюдав за ними, пришел к выводу, что любая пара кроликов производит на свет другую пару каждый месяц, начиная со второго месяца своего существования. Он решил рассчитать сколько кроликов будет через год и нашел ответ (377 пар), получив числовой ряд: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610… Этот ряд, названный его именем тесно связан с золотым сечением и огромным числом природных и социальных явлений вокруг нас. Расчет его значений производится по следующему уравнению:

fib_form

Посмотрим, какими путями можно рассчитать эти числа имея под рукой python.

Итеративно

Самый простой и очевидный способ расчета. Расчет числа через цикл, линейное время выполнения. Среди недостатков – расчет одного и того же числа по несколько раз, хотя для каждого следующего нужно всего лишь два предыдущих.

Рекурсивно

Красивая реализация, но с экспоненциальным временем выполнения и переполнением стека на больших значениях n. Можно сделать ее еще красивее записав код функции в одну строчку:

Генеративно

Используя генератор, при каждом вызове next() выдается новое число ряда. Довольно красиво, просто и быстро.

Сохраняя

Метод подсчета последовательности с сохранением промежуточных элементов называется мемоизацией.

Каждое число сохраняется в словарь, и возвращается оттуда по надобности. На расчет уходит линейное время.

Возможно, эта статья наведет вас на красивые решения ваших алгоритмических проблем.

Поделиться: