首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有记忆功能的斐波那契数在Python中运行很慢?

有记忆功能的斐波那契数在Python中运行很慢?
EN

Stack Overflow用户
提问于 2012-03-09 10:32:03
回答 4查看 2.5K关注 0票数 2
代码语言:javascript
复制
def fib(n):
    if n == 1:
        return 0
    if n == 2:
        return 1
    return fib(n-2) + fib(n-1)


def memo(f):
    cache = {}
    def memoized(n):
        if n not in cache:
            cache[n] = f(n)
        return cache[n]
    return memoized

fib1 = memo(fib)

这段代码在我的笔记本电脑上运行非常慢,但是如果我把名字fib1改成fib,那么一切都能正常工作,fine...anyone知道原因吗?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-09 10:40:55

fib递归到fib中,而不是fib1中。如果记忆版本有一个不同的名称,它将不会被使用。

票数 5
EN

Stack Overflow用户

发布于 2012-03-09 10:39:04

在该代码中,fib是非记忆函数的名称。fib1是您为memoized函数指定的名称。但是,如果您看到您的代码,您将看到它递归地调用非记忆版本的fib。这就是为什么你没有获得速度优势的原因。

票数 2
EN

Stack Overflow用户

发布于 2012-03-09 10:52:13

我同意添加一些指纹,您可能会看到问题。你已经非常接近实际得到它了。

您现在拥有的只存储n,其中n是提供给fib1的参数。在fib内部,你调用fib,它不会记录任何先前计算的值。因此,通过将打印语句添加到fib print "fib ", n并调用fib1(4),您将获得以下输出:

fib 4

图2

图3

图1

fib 2

所以你可以看到它用n=2调用了fib两次。fib更快的原因是因为它实际上是fib = memo(fib),因为你将fib重新定义为memoized函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9628174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档