【问题标题】:memoization not working as expected记忆没有按预期工作
【发布时间】:2023-04-01 20:43:01
【问题描述】:

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

我有一个使用记忆的简单斐波那契数列递归函数

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”(即函数的名称)会导致这种行为

【问题讨论】:

    标签: python algorithm recursion dynamic-programming memoization


    【解决方案1】:

    原因是m = Memoize(fibbo3) 不会影响从fibbo3fibbo3 的递归引用,而fibbo3 = Memoize(fibbo3) 会。

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

    【讨论】:

    • "原因是 m = Memoize(fibbo3) 不会影响从 fibbo3 对 fibbo3 的递归引用,而 fibbo3 = Memoize(fibbo3) 会"............你能告诉我。为什么会这样?
    • 因为在fibbo3函数内部,它不知道你以后要Memoize它。您可以将该行重写为return Memoize(fibbo3(n-1)) + Memorize(fibbo3(n-2))
    猜你喜欢
    • 2019-04-24
    • 2018-12-12
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    相关资源
    最近更新 更多