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)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |