【发布时间】:2014-01-21 10:48:48
【问题描述】:
我不明白为什么下面的代码会使fib 以线性而不是指数时间运行。
def memoize(obj):
"""Memoization decorator from PythonDecoratorLibrary. Ignores
**kwargs"""
cache = obj.cache = {}
@functools.wraps(obj)
def memoizer(*args, **kwargs):
if args not in cache:
cache[args] = obj(*args, **kwargs)
return cache[args]
return memoizer
@memoize
def fib(n):
return n if n in (0, 1) else fib(n-1) + fib(n-2)
例如,fib(100) 并没有像我预期的那样完全炸毁。
我的理解是@memoize 设置fib = memoize(fib)。所以当你调用fib(100)时,看到100不在缓存中,它会在100上调用obj。但是obj 是原始的fib 函数,所以它不应该和我们根本没有记忆一样长(在第一次评估中)吗?
【问题讨论】:
标签: python recursion memoization