使用实例 variable/function 属性实现备忘录与在每次调用中传递备忘录相比有什么需要或好处?

What is the need or benefit to use an instance variable/function attribute to implement memoization vs passing down the memo in each call?

在很多备忘录示例中,我最常看到人们喜欢制作包装器或装饰器(或一些与语言相关的变体,例如使用高阶函数关闭备忘录对象) 以几乎 'state-like' 的方式存储先前函数调用的结果。这样的例子可以在下面看到:

class Memoize(object):
    def __init__(self, func):
        self.func = func
        self.cache = {}
    def __call__(self, *args):
        if args in self.cache:
            return self.cache[args]
        ret = self.func(*args)
        self.cache[args] = ret
        return ret

@Memoize
def fib(n):
    if n < 2:
        return 1
    return fib(n-2) + fib(n-1)

以这种方式做事与简单地在函数的参数中传递备忘录有什么区别/权衡?比如像这样:

def fib(n, memo = {}):
    if (n < 2):
        return 1
    if (n in memo):
        return memo[n]
    memo[n] = fib(n - 1) + fib(n - 2)
    return memo[n]

关注点分离:您不想将 fib 的干净整洁的实现与提高效率所需的所有簿记混为一谈。让 fib 计算斐波那契数,让 Memoize 担心记忆 fib(或任何其他函数)。