我是算法的新手,所以我尝试了几种算法的可能性,特别是内存
我有一个使用内存的简单斐波那契数列递归函数
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)
不影响 fibbo3
对 fibbo3
的递归引用,而 fibbo3 = Memoize(fibbo3)
可以。
您可能还想考虑使用 memoizing decorators 之一在 Python 装饰器库中。
关于python - 内存无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46519741/