感谢国防科技大学刘万伟老师和中国传媒大学胡凤国两位老师提供的思路,文章作者不能超过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')
----------相关阅读---------
Python快速计算Fibonacci数列中第n项的方法
Python版组合数计算方法优化思路和源码
Python组合列表中多个整数得到最小整数(一个算法的巧妙实现)
Python编写人机对战小游戏(抓小狐狸)
Python寻找给定序列中相差最小的两个数字
几行Python代码模拟轮盘抽奖游戏
Python使用递归法对整数进行因数分解
Python模拟大整数乘法的小学竖式计算过程
基于非递归算法的汉诺塔游戏之Python实现
Python计算有向图节点的入度和出度
Python使用广度优先和深度优先两种方法遍历目录树
Python使用筛选法计算小于给定数字的所有素数
哈夫曼编码原理与Python实现代码(附手动推导过程原稿真迹)
Python版堆排序算法
Python版归并排序算法(附Python程序__name__属性用法演示视频)
Python版快速排序算法(附pip安装扩展库演示视频)
Python模拟汉诺塔问题移动盘子的过程
Python版双链表结构与有关操作
侏儒排序算法原理与Python实现
Python实现单链表
Python版基于递归的冒泡排序算法
Python版快速排序算法
Python版选择排序算法
Python版冒泡法排序算法
Python计算整数阶乘的几种方法比较
鸡兔同笼问题新解与Python实现
Pythonic:递归、回溯等5种方法生成不重复数字整数
一维序列卷积之Python实现