memoization没有按预期工作

时间:2017-10-02 05:01:13

标签: python algorithm recursion dynamic-programming memoization

我是算法的新手,所以我正在尝试几种算法的可能性,特别是记忆

我有一个简单的Fibonacci系列递归函数,使用memoisation

class Memoize:
    def __init__(self, f):
        self.f = f
        self.memo = {}
    def __call__(self, *args):
        if not args in self.memo:
            self.memo[args] = self.f(*args)
            print args
        print self.memo
        return self.memo[args]

def fibbo3(n):
    if n==1:
        return 1
    elif n==0:
        return 0
    else:
        return fibbo3(n-1) + fibbo3(n-2)

m = Memoize(fibbo3)

m(4)
print "check the memo"
print m.memo

(4,)
{(4,): 3}
check the memo
{(4,): 3}

但如果我打电话

fibbo3 = Memoize(fibbo3)
fibbo3(4)
print 'ckeck the memo'
fibbo3.memo

(1,)
{(1,): 1}
(0,)
{(0,): 0, (1,): 1}
(2,)
{(2,): 1, (0,): 0, (1,): 1}
{(2,): 1, (0,): 0, (1,): 1}
(3,)
{(2,): 1, (0,): 0, (3,): 2, (1,): 1}
{(2,): 1, (0,): 0, (3,): 2, (1,): 1}
(4,)
{(2,): 1, (0,): 0, (3,): 2, (1,): 1, (4,): 3}
ckeck the memo
Out[524]:
{(0,): 0, (1,): 1, (2,): 1, (3,): 2, (4,): 3}

我看到整个备忘录字典。为什么要改变' m'到了' fibbo3' (即函数的名称)导致这种行为

1 个答案:

答案 0 :(得分:4)

原因是@Component({ selector: 'dynamic-form', templateUrl: './dynamic-form.component.html', providers: [DynamicControlService] }) 不会影响m = Memoize(fibbo3)fibbo3的递归引用,而fibbo3会这样做。

您可能还想考虑使用Python装饰器库中的memoizing decorators之一。