我尝试将记忆应用于斐波那契函数,这是我的第一个版本的代码:
def memoize(f):
memo = {}
def memo_appel(x):
if x not in memo:
memo[x] = f(x)
return memo[x]
return memo_appel # Return the memoized function
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
fib = memoize(fib)
print(fib(40))
Here is my second version of the code:
`def memoize(f):
memo = {}
def memo_appel(x):
if x not in memo:
memo[x] = f(x)
return memo[x]
return memo_appel # Return the memoized function
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
fib_40 = memoize(fib)
print(fib_40(40))`
我很难理解为什么当我们将
fib=memoize(fib)
替换为 fib_40=memoize(fib)
时第二个不起作用
如果您能提供一个简单的解释,我将不胜感激。
为了使记忆功能发挥作用,该函数需要像您的
fib
那样使用全局绑定。
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2) # calls whatever fib resolves to
fib_40 = memoize(fib)
将不起作用,因为您将记住初始调用,但来自 fib
的所有连续调用都会转到原始 fib
并且不会被记住。 fib = memoize(fib)
会将 fib
中发生的情况从递归更改为间接递归。
这也意味着,如果您要创建一个辅助函数来完成繁重的工作并保持名称私有,则该函数将无法被记忆。