Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python快速计算Fibonacci数列中第n项的方法

Python快速计算Fibonacci数列中第n项的方法

作者头像
Python小屋屋主
发布于 2018-04-16 07:52:04
发布于 2018-04-16 07:52:04
1.5K0
举报
文章被收录于专栏:Python小屋Python小屋

from time import time from functools import lru_cache

def fibo1(n): '''递归法''' if n in (1, 2): return 1 return fibo1(n-1) + fibo1(n-2)

@lru_cache(maxsize=64) def fibo2(n): '''递归法,使用缓存修饰器加速''' if n in (1, 2): return 1 return fibo2(n-1) + fibo2(n-2)

def fibo3(n): '''序列解包''' a, b = 1, 1 for i in range(2, n+1): a, b = b, a+b return a

# 测试3个函数的执行速度 n = 40 for fibo in (fibo1, fibo2, fibo3): start = time() print(fibo.__name__, fibo(n), sep=':', end=':')

print(time()-start)

运行结果:

fibo1:267914296:67.31945824623108 fibo2:267914296:0.0 fibo3:267914296:0.0

由于第一个函数运行速度非常慢,在n变大时只测试后面2个函数的执行时间,当n=120时,运行结果为:

fibo2:5358359254990966640871840:0.0 fibo3:5358359254990966640871840:0.0

当n=220时,运行结果为:

fibo2:4244200115309993198876969489421897548446236915:0.0 fibo3:4244200115309993198876969489421897548446236915:0.0

当n=380时,第二个函数由于递归深度过大而崩溃,抛出异常

RecursionError: maximum recursion depth exceeded while calling a Python object

下面继续测试第3个函数,当n=500时,运行结果为:

fibo3:139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125:0.015594482421875

当n=1000时,运行结果为:fibo3:43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875:0.035840511322021484

当n=8000时,运行结果为:

fibo3:3561533204460626739768914905427460387141369539110154082973500638991885819498711815304829246223963373749873423083216889782034228521693267175594214186111978816819236959743284321273097535654614718808050244321699002512466203835566030351092652496815708455980825654877181538741827129421689128991879649533246136168998590044965735035810856774605383628378979290580539135791985063484992877932473487054068899476937399295193905527420792975902913836012199062687063537510151753758100626402591751183925883151617648375005313453493271681248233059858496951790113255897429539560654496639601132039360167542277472498901884679404509894269174519328918160745655327632006736189766801968534195725815421784083495026969542066047758885029695257263330719223956309043195653930347983496830801755572982419821881275569179922973415736010289561700699477021488635509784509168019589640190234350021673802856836365767446249424907273016689053388000785637444921523414602360860001530139933615215383220927084750528293779491002813557093860863839463287251443115581618266959802005566973874793475256663122039030056061200186123236430592279484254766158650545069933528061680141046574115103014532101595841822474764213889385114174543352137856680694687244097968099924183815689652779302937329729253678579649215884078334428338037327451220722810587680172255878795449524781554973097109174140632623167659027450550461045055883872225659796812847075286475208205923875668405160707778568995306926178023176315799965539425437791083258303238592641010878264249883586034912756021070468742995902773902487497010335873840408520900059054071283266816325489230566003110549946685475230821114509971542662742044237174282248020953398789607528748909125:0.09996175765991211

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
开源图书《Python完全自学教程》7.5递归
在7.1.2节编写斐波那契数列函数的时候,使用了 Python 中的递归(Recursion)。固然 Python 创始人对递归有个人的看法,此处还是要用单独一节专门给予介绍。等读者阅读完本节内容,也能理解之所以如此重视递归的原因了。
老齐
2022/07/06
1.2K0
开源图书《Python完全自学教程》7.5递归
Python中的装饰器详解及实际应用
在Python编程中,装饰器(Decorator)是一种强大而灵活的工具,用于修改函数或方法的行为。它们广泛应用于许多Python框架和库,如Flask、Django等。本文将深入探讨装饰器的概念、使用方法,并提供实际应用的代码示例和详细解析。
一键难忘
2024/04/16
6190
9个Python 内置装饰器: 显著优化代码
装饰器是应用“Python 之禅”哲学的最佳 Python 特性。装饰器可以帮助您编写更少、更简单的代码来实现复杂的逻辑并在任何地方重用它。
数据科学工厂
2023/01/19
1.1K0
学会这个,Python的递归再也不慢了
之前我在学 Python 的时候,第一次觉得它慢是执行一个递归函数,来求斐波那契数列,计算第 40 个数就需要 37 秒,同样的逻辑使用 java,则不到 1 秒就执行完毕。以下是在 IPython 环境下的运行耗时:
somenzz
2020/11/25
5810
10个鲜为人知的Python技巧,助你提升编程技能!
然而,在其广为人知的路径之外,隐藏着一些鲜为人知的技巧和技术,它们可以将你的Python编码技能提升到新的高度。
小F
2024/06/18
1520
10个鲜为人知的Python技巧,助你提升编程技能!
Python性能提升大杀器:深入解析functools.lru_cache装饰器
在编写程序时,经常会遇到需要计算某个函数的输出,然后在稍后的代码中多次使用该输出的情况。
雷子
2024/02/06
4250
Python性能提升大杀器:深入解析functools.lru_cache装饰器
通过例子学递归
在文章正式开始之前,大家先思考一个问题:给定 1 元、2 元、5 元、10 元 四种纸币,如何通过组合(不限制单张纸币的使用次数)购买 12 元的商品?如果不考虑排序次序,有多少种组合方式?如果考虑排列次序,又有多少种可能的组合?例如十张一元的纸币。大家可以尝试使用 Python 解决此类问题,在文章的结尾处,我会提供自己的思考结果。
用户2870857
2019/12/23
7160
10个提升Python生产力的小技巧
Python生产力提升技巧不仅能帮助开发者更快速、更高效地编写代码,还能提升代码的性能和可读性。以下是10个实用的技巧,每个技巧配有具体应用场景、案例代码、时间复杂度和空间复杂度分析,以及使用前后的性能对比。
老表
2024/07/10
1700
10个提升Python生产力的小技巧
让Python程序轻松加速的方法
最近,我读了一篇有趣的文章,文中介绍了一些未充分使用的Python特性的。在文章中,作者提到,从Python 3.2开始,标准库附带了一个内置的装饰器 functools.lru_cache 。我发现这个装饰器很令人兴奋,有了它,我们有可能轻松地为许多应用程序加速。
博文视点Broadview
2020/06/12
1.1K0
让Python程序轻松加速的方法
Fibonacci数列第n项的第7种计算方法:Python列表
前面已经分享了几种计算Fibonacci数列第n项的方法,详见Python快速计算Fibonacci数列中第n项的方法和三种Fibonacci数列第n项计算方法及其优劣分析,本文分享第7种(过几天分享第8种),主要演示列表的append()和pop()这两个方法和反向索引的用法。如果n小的话,可以只append()不pop()(注意,这样的话append()的参数要改为data[-1]+data[-2]),但是如果n很大的话会导致内存崩溃。 下面的代码使用第800万项对本文的第7种方法和前面6种中最快的方法
Python小屋屋主
2018/04/16
6700
这10个Python性能调优的小技巧,你知道几个?
你好,我是 zhenguo 这是我的第479篇原创,这篇文章关于Python性能调优的10个小技巧,每天花5-10分钟阅读我的文章,对你技术提升一定会有帮助。
double
2021/11/25
4720
这10个Python性能调优的小技巧,你知道几个?
leetcode每日一题:509. 斐波那契数
https://leetcode-cn.com/problems/fibonacci-number/
用户7685359
2021/01/08
3690
Python高性能编程:五种核心优化技术的原理与Python代码
在性能要求较高的应用场景中,Python常因其执行速度不及C、C++或Rust等编译型语言而受到质疑。然而通过合理运用Python标准库提供的优化特性,我们可以显著提升Python代码的执行效率。本文将详细介绍几种实用的性能优化技术。
CoovallyAIHub
2025/02/18
770
Python高性能编程:五种核心优化技术的原理与Python代码
如何写出高性能Python之缓存的应用?
  能看到这篇文章的同学,应该都对缓存这个概念不陌生,CPU中也有一级缓存、二级缓存和三级缓存的概念。缓存可以解决哪些问题?我们直接把网上的一段话放上来:
猫叔Rex
2021/01/29
5310
Python的7个台阶,你怎么走?
来看一道有点意思的题目,有点意思的意思呢,不是说难,而是题目一想好像很难,但是如果找对了解决的思路,就能迎刃而解了。
一墨编程学习
2019/05/19
7350
Python函数装饰器高级用法
函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过自由变量绑定后,调用函数并返回结果。
dongfanger
2021/06/10
8830
Python函数装饰器高级用法
Python两种方法求解登楼梯问题(京东2016笔试题)
问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法? 解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一步迈2个台阶上来,从第12个台阶上一步迈3个台阶上来),同理,第14个、13个、12个台阶都可以这样推算,从而得到公式f(n) = f(n-1) + f(n-2) + f(n-3),其中n=15、14、13、...、5、4。然后就是确定这个递归公式的结束条件了,第一个台阶只有1种上法,第二个台阶有2种上法(一步
Python小屋屋主
2018/04/16
2K0
Python函数缓存器
平时常听说使用redis做缓存,但是redis换缓存存放的是结果数据,从Python 的 3.2 版本开始,引入了一个非常优雅的缓存机器
Autooooooo
2020/11/09
9050
Python函数缓存器
Python新手必学:10个内置模块让你的代码更高效
collections模块提供了额外的数据结构,如Counter, defaultdict和namedtuple。这些结构可以让你的代码更简洁、更高效。
统计学家
2024/09/12
1130
Python新手必学:10个内置模块让你的代码更高效
【重修Python】谈一谈递归
当我们想知道第n(n>2)个月兔子的数量,就可以向下一层一层的向下去问,这个过程就叫做"递"。一直"递"到无法再"递"的节点,然后再将结果一层一层汇总,向上“归”。那么我们说这个过程,可以称之为递归。
花花Binki
2024/01/09
4990
【重修Python】谈一谈递归
推荐阅读
相关推荐
开源图书《Python完全自学教程》7.5递归
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档