如何使用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 调用HBase的简单实例
Dec 18 Python
Python 中 list 的各项操作技巧
Apr 13 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Django框架models使用group by详解
Mar 11 Python
django 模版关闭转义方式
May 14 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
Django框架请求生命周期实现原理
Nov 13 Python
python numpy中setdiff1d的用法说明
Apr 22 Python
Elasticsearch 聚合查询和排序
Apr 19 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
国内咖啡文化
2021/03/03 咖啡文化
PHP高级OOP技术演示
2009/08/27 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
PHP实现简单的计算器
2020/08/28 PHP
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
JS给超链接加确认对话框的方法
2015/02/24 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
2015/04/27 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
js正则表达式replace替换变量方法
2016/05/21 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
webpack 样式加载的实现原理
2018/06/12 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
德国高尔夫商店:Par71.de
2020/11/29 全球购物
音乐学个人的自荐书范文
2013/11/26 职场文书
幼儿园老师寄语
2014/04/03 职场文书
公司职员入党自传书
2015/06/26 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL