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 шт):
На английском SO что-то подобное уже задавали.
Рассуждения верны. Попробую раскрыть.
fib в глобальном поле зрения заменяется на wrap. Внутри функции wrap мы вызываем оригинальную функцию fib, ссылка на которую хранится в локальной переменной f.
А вот внутри оригинальной функции, вызывая, fib, мы берем ссылку на нее уже из глобального поля зрения. А под fib у нас функция wrap.