Шаг 5.
Задачи ComputerScience на Python.
Простые задачи. Ряд Фибоначчи. Автоматическая мемоизация

    На этом шаге мы рассмотрим использование декоратора для автоматической мемоизации.

    Функцию fib3() можно сделать еще проще. В Python есть встроенный декоратор для автоматической мемоизации любой функции. В fib4() декоратор @functools.lru_cache() использован точно с тем же кодом, который мы применили в fib2(). Каждый раз, когда fib4() выполняется для нового аргумента, декоратор выполняет кэширование возвращаемого значения. При последующих вызовах fib4() для того же аргумента сохраненное значение извлекается из кэша и возвращается.

from functools import lru_cache


@lru_cache(maxsize=None)
def fib4(n: int) -> int:  # такое же определение, как в fib()
    if n < 2:  # базовый случай
        return n
    return fib4(n - 2) + fib4(n - 1)  # рекурсивный случай


if __name__ == "__main__":
    print(fib4(5))
    print(fib4(50))
Архив с файлом можно взять здесь.

    Обратите внимание: мы можем мгновенно вычислить fib4(50), несмотря на то что тело функции Фибоначчи такое же, как и в fib2(). Свойство @lru_cache maxsize определяет, сколько последних вызовов функции, которые оно декорирует, должно быть закэшировано. Значение None означает отсутствие ограничений.

    На следующем шаге мы рассмотрим еще один способ вычисления требуемого числа Фибоначчи.




Предыдущий шаг Содержание Следующий шаг