在这种情况下函数式编程是如何工作的?

问题描述 投票:0回答:1

我尝试将记忆应用于斐波那契函数,这是我的第一个版本的代码:


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)

时第二个不起作用

如果您能提供一个简单的解释,我将不胜感激。

functional-programming fibonacci
1个回答
0
投票

为了使记忆功能发挥作用,该函数需要像您的

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
中发生的情况从递归更改为间接递归。

这也意味着,如果您要创建一个辅助函数来完成繁重的工作并保持名称私有,则该函数将无法被记忆。

© www.soinside.com 2019 - 2024. All rights reserved.