首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memoization没有按预期工作

memoization没有按预期工作
EN

Stack Overflow用户
提问于 2017-10-02 13:01:13
回答 1查看 274关注 0票数 4

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

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

代码语言:javascript
复制
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}

但如果我打电话给

代码语言:javascript
复制
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}

我看到了整本有记忆的字典。WHy将变量名称从'm‘更改为'fibbo3’(即函数的名称)会导致这种行为

EN

回答 1

Stack Overflow用户

发布于 2017-10-02 14:02:19

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

您可能还想考虑使用Python Decorator Library中的一个memoizing decorators

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46519741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档