1
我有下面的代碼python裝飾器如何與遞歸一起工作?
def memo(fn):
cache = {}
miss = object()
print 'MEMO'
def wrapper(*args):
result = cache.get(args, miss)
print 'IT CALLS'
if result is miss:
print 'IT MISSES'
result = fn(*args)
cache[args] = result
return result
return wrapper
@memo
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
當我打電話FIB(4)它打印MEMO只有一次。以下是輸出。
MEMO
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT MISSES
IT CALLS
IT CALLS
是什麼導致了這種行爲?
可能是非相關的,但您可能想要使用(fib(n),fib(n-1))的元組作爲fib函數的返回值來使用fib的線性計算。 – DainDwarf
你真的想閱讀[this excellent answer]的所有*(https://stackoverflow.com/a/1594484/100297)。 –