加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python 2.7 – 递归Fibonacci爆炸

发布时间:2020-12-20 12:29:12 所属栏目:Python 来源:网络整理
导读:我有两个函数fib1和fib2来计算Fibonacci. def fib1(n): if n 2: return 1 else: return fib1(n-1) + fib1(n-2)def fib2(n): def fib2h(s,c,n): if n 1: return s else: return fib2h(c,s + c,n-1) return fib2h(1,1,n) fib2工作正常,直到它超过递归限制.如果
我有两个函数fib1和fib2来计算Fibonacci.

def fib1(n):
    if n < 2:
        return 1
    else:
        return fib1(n-1) + fib1(n-2)

def fib2(n):
    def fib2h(s,c,n):
        if n < 1:
            return s
        else:
            return fib2h(c,s + c,n-1)
    return fib2h(1,1,n)

fib2工作正常,直到它超过递归限制.如果理解正确,Python不会针对尾递归进行优化.我很好.

让我的是,即使n值非常小,fib1也开始减速停止.为什么会这样?为什么它在缓慢之前没有达到递归限制?

解决方法

基本上,你通过计算fib1以获得相同的n值来浪费大量时间.您可以轻松地记住这样的功能

def fib1(n,memo={}):
    if n in memo:
        return memo[n]
    if n < 2:
        memo[n] = 1
    else:
        memo[n] =  fib1(n-1) + fib1(n-2)
    return memo[n]

您会注意到我使用空dict作为默认参数.这通常是一个坏主意,因为相同的dict被用作每个函数调用的默认值.

在这里,我利用它来记住我计算的每个结果

您还可以使用0和1来填充备忘录,以避免需要n< 2测试

def fib1(n,memo={0: 1,1: 1}):
    if n in memo:
        return memo[n]
    else:
        memo[n] =  fib1(n-1) + fib1(n-2)
    return memo[n]

哪个成了

def fib1(n,1: 1}):
    return memo.setdefault(n,memo.get(n) or fib1(n-1) + fib1(n-2))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读