python - 内存无法按预期工作

标签 python algorithm recursion dynamic-programming memoization

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

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

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

最佳答案

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

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

关于python - 内存无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46519741/

相关文章:

c# - 实现快速排序算法

algorithm - 在 O(n log(log n)) 中对数组进行排序

javascript - Node.js 递归循环失败

c - 无限期地扩展内部 for 循环调用

python - setuptools/easy_install 不安装 *.cfg 文件和语言环境目录?

python - 无法写入 excel AttributeError : 'Worksheet' object has no attribute 'write'

Python 的 sys.settrace 不会创建 c_call 事件

java - 以两种方式比较两个 ArrayList?

MySQL 查询或存储过程递归调用自身并返回所选父节点的所有节点

Python - 返回构造函数参数名称而不实例化