Python Magic Syntax

def fib(n):
    return n if n < 2 else fib(n - 1) + fib(n - 2)

def memo(f):
    cache = {}
    def wrap(n):
        if n not in cache:
            cache[n] = f(n)
        return cache[n]
    return wrap

fib = memo(fib)

Правильно ли я все понял: в функцию memo мы передаем функцию fib которая рекурсивно вычисляет числа фибоначчи по n-параметру , на эту функцию указывает атрибут f, который и будет вызывать функцию fib в функции wrap.Далее мы переопределяем функцию fib функцией wrap и вот у меня вопрос , когда мы вызываем фукнцию f(n) ( строка - cache[n] = f(n)) у нас вызывается fib функция , а вот в этой функции у нас рекурсивно вызывается функция wrap?


Ответы (1 шт):

Автор решения: mrEvgenX

На английском SO что-то подобное уже задавали.

Рассуждения верны. Попробую раскрыть.

fib в глобальном поле зрения заменяется на wrap. Внутри функции wrap мы вызываем оригинальную функцию fib, ссылка на которую хранится в локальной переменной f.

А вот внутри оригинальной функции, вызывая, fib, мы берем ссылку на нее уже из глобального поля зрения. А под fib у нас функция wrap.

→ Ссылка