Рубрики
Без рубрики

Как реализовать последовательность Фибоначчи с Python

Реализация последовательности фибоначчи с Python. Теги с Фибоначчи, Питон, Наука данных, Интервью.

Последовательность Фибоначчи является одним из самых популярных вопросов собеседования. Есть несколько способов реализовать его с Python. Давайте посмотрим, как это сделать.

Последовательность Фибоначчи это серия чисел:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

Следующее число найдено, добавив два номера до него.

  • 2 найден, добавив два номера до него (1 + 1)
  • 3 находится, добавив два номера до него (1 + 2),
  • И 5 (2 + 3),
  • и так далее!

Правило Последовательность Фибоначчи является

X (N) (N-1) + X (N-2)

где:

x (n) – это номер «n» X (N-1) – предыдущий термин (N-1) X (N-2) – это термин до этого (N-2)

Источник : https://www.mathsisfun.com/numbers/fibonacci-seachence.html.

Метод 1: с для петли

# using for loop 

def fibonacci_loop(num):
    if num == 0:
        return 0
    elif num == 1 or num == 2:
        return 1
    elif num > 2:
        a = 1 # variable for (n - 1)
        b = 1 # variable for (n - 2)
        for _ in range(3, num + 1):
            c = a + b
            a, b = b, c

        return c
%time fibonacci_loop(40)
    CPU times: user 6 µs, sys: 0 ns, total: 6 µs
    Wall time: 8.11 µs
    102334155

С рекурсией

Мы можем решить проблему с циклом, но это не так интуитивно. Из правила последовательности фибоначчи X (N) (N-1) + X (N-2) , Мы можем сделать функцию, которая позвонит себе, это называется рекурсивный функция.

# Recursive Method 1 : traditional recursive function

def fibonacci_recursion(num):
    '''Return a fibonacci sequence value of num'''
    if num == 0:
        return 0
    if num == 1 or num == 2:
        return 1

    return fibonacci_recursion(num - 2) + fibonacci_recursion(num - 1)

%time fibonacci_recursion(40)
    CPU times: user 26.5 s, sys: 64 ms, total: 26.6 s
    Wall time: 26.6 s
    102334155

Тихо медленно ??

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

# Recursive Method 2 : With using explicit cache
cache = {}

def fibonacci_cache(num):
    '''Return a fibonacci sequence value of num'''

    if num in cache:
        return cache[num]

    if num == 0:
        result = 0
    elif num == 1 or num == 2:
        result = 1
    else:
        result = fibonacci_cache(num - 2) + fibonacci_cache(num - 1)

    cache[num] = result
    return result

%time fibonacci_cache(40)
    CPU times: user 2 µs, sys: 0 ns, total: 2 µs
    Wall time: 5.01 µs
    102334155

тот же результат, но супер быстрее, чем обычная рекурсивная функция

Используя кэш LRU

Python предоставляет Functools Библиотека помогает рекурсивным вызовам функции, Давайте использовать наименее недавно использованные кеш (lru_cache) от функциональности

# import library
from functools import lru_cache
# Recursive Method 3 : with implicit cache provided by functools

# set cache with 1000 (need to set a big values, small cache is NOT useful)
@lru_cache(maxsize = 1000)

def fibonacci(num):
    '''Return a fibonacci sequence value of num'''

    if num == 0:
        return 0
    if num == 1 or num == 2:
        return 1

    return fibonacci(num - 2) + fibonacci(num - 1)
%time fibonacci(40)
    CPU times: user 3 µs, sys: 0 ns, total: 3 µs
    Wall time: 5.25 µs
    102334155

Маленькие различные значения времени, но его можно игнорировать. (Просто несколько микро секунд)

Вывод

Нам нужно установить lru_cache. При использовании рекурсивной функции для производительности

Источник : https://github.com/teosoft7/fibonacci_python.git.git.

Оригинал: “https://dev.to/teosoft7/how-to-implement-fibonacci-sequence-with-python-4cfo”