python编写递归函数、求斐波那契数列第n项_Python快速计算Fibonacci数列中第n项的方法...

原标题:Python快速计算Fibonacci数列中第n项的方法

fromtime importtime

fromfunctools importlru_cache

deffibo1(n):

'''递归法'''

ifn in(1, 2):

return1

returnfibo1(n-1) + fibo1(n-2)

@lru_cache(maxsize=64)

deffibo2(n):

'''递归法,使用缓存修饰器加速'''

ifn in(1, 2):

return1

returnfibo2(n-1) + fibo2(n-2)

deffibo3(n):

'''序列解包'''

a, b = 1, 1

fori inrange(2, n+1):

a, b = b, a+b

returna

# 测试3个函数的执行速度

n = 40

forfibo 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时,第二个函数由于递归深度过大而崩溃,抛出异常:

Recursi: 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返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值