【发布时间】:2016-10-23 23:56:00
【问题描述】:
好吧,这个问题有点奇怪,但是我想知道我是否可以这样做。
我正在开发一个简单的斐波那契数生成器,因为我对编程很感兴趣。 所以我写了这个:
def f(n):
if n == 1: return 1
if n == 2: return 2
else:
return f(n-1) + f(n-2)
而且运行速度非常慢,在我的电脑上运行f(30) 需要 15 秒。
于是我写了这个:
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
它基本上将以前的结果存储在字典中,如下所示:
{'f(1)':1,'f(2)':2,'f(3)':3,'f(4)':5} 等等。在函数中,它会检查该结果是否在该字典中,然后只需使用它,而不必重做所有计算。
这使它更快。我可以做f(100),它会立即出现。每隔 500 次,我到达f(4000),它仍然是瞬时的。一个问题是字典变得非常大。
所以我在函数末尾添加了a = {},但没有奏效;它仍然留下了 a 作为一个庞大的字典。
这样做:
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
a = {}
没用。但如果我这样做:
def f(n):
global a
if n == 1: return 1
if n == 2: return 1
else:
if "fib(%s)" % n in a:
return a["fib(%s)" % n]
else:
z = f(n-1) + f(n-2)
a["fib(%s)" % n] = z
return z
# now run the function
f(100)
a = {}
a 被重置为空字典。为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
在 return z 之前添加了 a={} ?
-
没有@Skycc 不起作用。每次运行时都会重置整个想法无用。我想做的是在调用最后一次递归后重置字典。
-
很奇怪,它在我身边工作,“if "fib(%s)" % n in a:" 将递归调用,else 部分将是最后一个递归部分,return z 将退出功能已经
-
请注意,您可以通过将字典的键设为斐波那契索引(n,函数参数)而不是字符串来大幅缩小您的字典。此外,根本不需要递归地执行此操作;类似
a, b = 0, 1; for _ in range(n): a, b = b, a+b -
谢谢@James 我精简了字典
标签: python python-2.7 dictionary fibonacci