前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三种Fibonacci数列第n项计算方法及其优劣分析

三种Fibonacci数列第n项计算方法及其优劣分析

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

感谢国防科技大学刘万伟老师和中国传媒大学胡凤国两位老师提供的思路,文章作者不能超过8个字符,我的名字就写个姓吧,名字不写了^_^。另外,除了本文讨论的三种方法,之前的文章中还讨论了另外几种方法,详见相关阅读第一篇。

def fibo4(n):

'''递推法

适用于任意大小的n

使用生成器函数

速度快,无误差'''

def nested():

a, b = 1, 1

while True:

yield a

a, b = b, a+b

# 创建生成器对象

temp = nested()

# 获取前n-1项

for i in range(n-1):

next(temp)

# 返回第n项

return next(temp)

def fibo5(n):

'''通项公式法,速度也不错

涉及实数运算,会有误差,

n越大,误差越大,

n大到一定程度会崩溃'''

z = 5**0.5

u = (1+z) / 2

v = (1-z) / 2

return int((u**n - v**n)/(u-v))

from sympy import sqrt, Symbol, simplify

def fibo6(n):

'''通项公式法,速度快

通过符号计算库的简化策略,

弥补了实数运算引入的误差'''

c1 = ((1+sqrt(5))/2)

c2 = ((1-sqrt(5))/2)

c3 = sqrt(5)

k = Symbol("k")

f = (c1**k-c2**k)/c3

return simplify(f.subs(k, n))

n = 50

print(fibo4(n))

print(fibo5(n))

print(fibo6(n))

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

12586269025

12586269025

12586269025

当n=80时,运行结果如下,注意开始fibo5有误差了:

23416728348467685

23416728348467744

23416728348467685

当n=200时,运行结果如下,误差越来越大了:

280571172992510140037611932413038677189525

280571172992512015699912586503521287798784

280571172992510140037611932413038677189525

当n=8000时,fibo4和fibo6仍然正常工作,而fibo5在n=1500左右时就已经无法工作了,代码崩溃。

Traceback (most recent call last):

File "C:/Python36/fibonacci.py", line 43, in <module>

print(fibo5(n))

File "C:/Python36/fibonacci.py", line 27, in fibo5

return int((u**n - v**n)/(u-v))

OverflowError: (34, 'Result too large')

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档