如何使用Python实现斐波那契数列


Posted in Python onJuly 02, 2019

斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一个真正研究斐波那契数列的是意大利数学家 Leonardo Fibonacci,斐波那契数列的定义很简单,用数学函数可表示为:

如何使用Python实现斐波那契数列

数列从0和1开始,之后的数由前两个数相加而得出,例如斐波那契数列的前10个数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34。

用 Python 实现斐波那契数列常见的写法有三种,各算法的执行效率也有很大差别,在面试中也会偶尔会被问到,通常面试的时候不是让你简单的用递归写写就完了,还会问你时间复杂度怎样,空间复杂度怎样,有没有可改进的地方。

递归法

所谓递归就是指函数的定义中使用了函数自身的方法

def fib_recur(n):
assert n >= 0
if n in (0, 1):
return n
return fib_recur(n - 1) + fib_recur(n - 2)
for i in range(20):
print(fib_recur(i), end=" ")
>>> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

递归是一种代码最简洁的方法,但它是效率非常低,因为会出现大量的重复计算,时间复杂度是:O(1.618 ^ n),1.618是黄金分割。同时受限于 Python 中递归的最大深度是 1000,所以用递归来求解并不是一种可取的办法。

递推法

递推法就是从0和1开始,前两项相加逐个求出第3、第4个数,直到求出第n个数的值

def fib_loop(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
for i in range(20):
print(fib_loop(i), end=" ")
>>> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

这种算法的时间复杂是O(n),呈线性增长,如果数据量巨大,速度越到后面会越慢。

上面两种方式都是使用分而治之的思想,就是把一个大的问题化小,然后利用小问题的求解得到目标问题的答案。

矩阵法

《线性代数》是大学计算机专业低年级的课程,这门课教的就是矩阵,那时候觉得这东西学起来很枯燥,没什么用处,工作后你才发现搞机器学习、数据分析、数据建模时大有用处,书到用时方恨少。其实矩阵的本质就是线性方程式。

斐波那契数列中两个相邻的项分别为:F(n) 和 F(n - 1),如果把这两个数当作一个2行1列的矩阵可表示为:

如何使用Python实现斐波那契数列

因为 F(n) = F(n-1)+F(n-2),所以就有:

如何使用Python实现斐波那契数列

通过反推,其实它是两个矩阵的乘积得来的

如何使用Python实现斐波那契数列

依此类推:

如何使用Python实现斐波那契数列

最后可推出:

如何使用Python实现斐波那契数列

因此想要求出F(n)的值,只要能求出右边矩阵的n-1次方的值,最后求得两矩阵乘积,取新矩阵的第一行的第一列的值即可,比如n=3时,

如何使用Python实现斐波那契数列

​可以得知F(3)的值2,F(2)的值为1,因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n)

我们可以用科学计算包 numpy 来实现矩阵法:

import numpy
def fib_matr(n):
return (numpy.matrix([[1, 1], [1, 0]]) ** (n - 1) * numpy.matrix([[1], [0]]))[0, 0]
for i in range(20):
print(int(fib_matr(i)), end=" ")
>>> 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

3中不同的算法效率对比:

如何使用Python实现斐波那契数列

从上面图可以看出递归法效率惊人的低,矩阵法在数据量比较大的时候才突显出它的优势,递推法随着数据的变大,所花的时间也越来越大。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
python列表操作实例
Jan 14 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
Python设计模式之代理模式简单示例
Jan 09 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
Python对切片命名的实现方法
Oct 16 Python
代码实例讲解python3的编码问题
Jul 08 Python
超简单的Python HTTP服务
Jul 22 Python
python对文件的操作方法汇总
Feb 28 Python
python 如何调用 dubbo 接口
Sep 24 Python
90行Python代码开发个人云盘应用
Apr 20 Python
pytorch 实现多个Dataloader同时训练
May 29 Python
pandas数据筛选和csv操作的实现方法
Jul 02 #Python
Python列表与元组的异同详解
Jul 02 #Python
Pandas中resample方法详解
Jul 02 #Python
Python何时应该使用Lambda函数
Jul 02 #Python
Python Pandas分组聚合的实现方法
Jul 02 #Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 #Python
python flask框架实现重定向功能示例
Jul 02 #Python
You might like
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
python实现redis三种cas事务操作
2017/12/19 Python
python实现停车管理系统
2018/11/30 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
财务工作个人求职的自我评价
2013/12/19 职场文书
食品安全宣传标语
2014/06/07 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python