Mam następujący fragment kodu ze strony Petera Norviga; to dekorator, który umożliwia zapamiętywanie w wywołaniach funkcji (buforowanie wcześniejszych wywołań funkcji w celu zmiany wykładniczej rekurencji na prosty program dynamiczny).Dlaczego linia w tej funkcji Pythona jest konieczna? (memoised recursion)
def memo(f):
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
Kod działa poprawnie, ale zastanawiam się, dlaczego sekundy do ostatniej linii jest konieczne. Jest to wyraźnie luka w mojej wiedzy na temat Pythona, ale usunięcie linii i uruchomienie prostej funkcji Fibonacci nadal wydaje się działać. Czy ma to związek z zapamiętaniem wielu funkcji jednocześnie? Dlaczego zmienną członkowską fmemo można nazwać memo (zakładając, że nie jest to niezręczny zbieg okoliczności)?
Dzięki!
Wcięcia kodu nie wygląda dobrze. Czy jest to funkcja zagnieżdżona? – MAK
FTFY ........... – katrielalex
BTW zostało to zaimplementowane w Pythonie 3.2 jako ['functools.lru_cache'] (http://docs.python.org/dev/library/functools.html#functools .lru_cache). – katrielalex