我有下面的代码
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
是什么导致了这种行为??
最佳答案
这是正确的行为,与递归无关。
MEMO 在装饰器被调用时打印,当它应用于函数时;即,在定义时。如果您根本不调用 fib()
,MEMO 仍会被打印出来。
关于python - python装饰器如何与递归一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041715/