Последовательность Фибоначчи является одним из самых популярных вопросов собеседования. Есть несколько способов реализовать его с 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”