斐波那契数列之python(5种方法)
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
1、递归方法
def fib_recur(n):if n<=1:return nelse:return fib_recur(n-1)+fib_recur(n-2)def ex(c):return int(c)X=input().strip().split()
N=list(map(lambda a:int(a), X))[0]for i in range(1, N):print(fib_recur(i),end=' ')
写法最简洁,但是效率最低,会出现大量的重复计算,时间复杂度O(1.618^n),而且最深度1000
2、递推方法
def fib_loop(n):a,b=0,1for i in range(n+1):a,b=b,a+breturn afor i in range(20):print(fib_loop(i),end=' ')
递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢
3、生成器
def fib_loop_while(n):a,b=0,1for i in range(0,n):a,b=b,a+byield afor i in fib_loop_while(20):print(i,end=' ')
怎么去解释这个生成器呢,我记得在以前的博客里面有提及到yield和yield from的区别,实际上更多只知道yield他是返回一个值而不退出这个函数执行。自然也就没有过多关注 fib_loop_while函数的返回对象类型是啥!
在这里系统解释一下:
1、带有yield关键字的函数对象 他是返回一个列表list,list中的每个元素 都是 yield返回的每一个值 (每次执行yield输出值构成的列表)
2、带有yield的函数都被看成生成器,生成器是可迭代对象,且具备__iter__ 和 __next__方法, 可以遍历获取元素
python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可
4、类实现内部魔法方法
class Fibonacci(object):"""斐波那契数列迭代器"""def __init__(self,n):self.n=nself.a=0self.b=1self.cur=0def __next__(self):"""当使用next()函数调用时,就会获取下一个数"""if self.cur<self.n:self.a,self.b=self.b,self.a+self.bself.cur=self.cur+1return self.aelse:raise StopIteration #让他异常停止def __iter__(self):"""迭代器的__iter__ 返回自身即可"""return selfif __name__=="__main__":lst=list(map(int,input().strip().split()))M=lst[0]fib=Fibonacci(M)for n in fib:print(n,end=' ')
5、 矩阵
### 1
import numpy as npdef fib_matrix(n):res = pow((np.mat([[1, 1], [1, 0]])), n) * np.mat([[1], [0]]) #使用mat方法直接定义矩阵return res[0][0]for i in range(10):print(int(fib_matrix(i)), end=' ')
print('\n')### 2
# 使用矩阵计算斐波那契数列
def Fibonacci_Matrix_tool(n):Matrix = np.matrix([[1, 1], [1, 0]]) #matrix和mat函数等效# 返回是matrix类型return pow(Matrix, n) # pow函数速度快于 使用双星好 **def Fibonacci_Matrix(n):result_list = []for i in range(0, n):result_list.append(np.array(Fibonacci_Matrix_tool(i))[0][0])return result_list# 调用
result=Fibonacci_Matrix(10)
for r in result:print(r,end=' ')
因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n)
用科学计算包numpy来实现矩阵法 O(log n)
斐波那契数列之python(5种方法)相关推荐
- 斐波那契数列通项公式的几种方法
1.递归 2.动态规划 3.矩阵快速幂 转载于:https://www.cnblogs.com/umrx/p/8145954.html
- 斐波那契数列的Python实现
斐波那契数列的Python实现:递归实现.非递归实现.斐波那契数列生成器: \[ \begin{equation} F(n)= \begin{cases} n & n=0, 1\\ F(n ...
- python实现斐波那契数列_斐波那契数列:python实现和可视化
1 说明 ==== 1.1 斐波那契数列的介绍. 1.2 斐波那契数列是上帝的指纹,大自然中随处可见,目前广泛应用到黄金分割线的布局美和股市等预测等等. 1.3 斐波那契数列的Python的matpl ...
- 斐波那契数列的背景及解决方法
斐波那契数列的背景及解决方法 背景: 前两天看到一道很有意思的数学题 假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖 ...
- python中斐波那契数列_斐波那契数列–在Python,JavaScript,C ++,Java和Swift中进行了解释...
python中斐波那契数列 by Pau Pavón 通过保罗·帕文(PauPavón) The Fibonacci sequence is, by definition, the integer s ...
- python程序题斐波那契数列通项公式,Python斐波那契数列应用,编程练习题实例六...
python斐波那契数列,本文是关于Python编程练习题和答案实例六,斐波那契数列应用的示例.引用百度关于斐波那契数列的介绍,大家先简单来的了解下,什么是斐波那契数列? 斐波那契数列(Fibonac ...
- 【斐波拉契数列】 Python
[斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和] 题目内容:已知斐波拉契数列的前两项都是1, 我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下:n=int ...
- python斐波那契数列函数,python—函数进阶-斐波那契数列
上次说到生成器的调用next(),这样很不方便,需要手动调,我们一般是循环着调,while ,for都可以 a = (i for i in range(5)) for i in a: print(i) ...
- python中斐波那契系数实现的几种方法
斐波那契系数的原理: 在第一个月有一对刚出生的小兔子,在第二个月小兔子变成大兔子并开始怀孕,第三个月大兔子会生下一对小兔子,并且以后每个月都会生下一对小兔子. 如果每对兔子都经历这样的出生.成熟.生育 ...
- JavaScript高级第2天:定义函数的三种方式、函数的原型链结构、完整原型链、作用域以及作用域链、函数的四种调用模式、闭包、计数器、斐波那契数列优化、三种继承方式
JavaScript高级第二天 01-定义函数的三种方式 1.函数声明 function:可以先调用再声明,因为预解析(把函数声明.变量声明进行提升) function fn() {//函数体conl ...
最新文章
- 网络工程师_记录的一些真题_2016上半年上午
- spring线程并发处理(ThreadLocal)
- 在ListBox中添加ToggleButton(有IsChecked属性)
- elementui进度条如何设置_vue.js+ElementUI实现进度条提示密码强度效果
- Leetcode--560. 和为K的子数组
- 网站链接跳转安全警告提示l单页源码
- mysql 替换 汉字_MySQL替换文字
- Unreal Engine 4 中的 UI 优化技巧
- 牌组资源英语_「桌游推荐」如果当年有这种能背单词的桌游,我早就成英语学霸了...
- Docker系列(二):Docker安装
- java多线程系类:JUC原子类:04之AtomicReference原子类
- Android开发技术周报 Issue#102
- python关机_Python 神操作: 远程开机和关机
- ASP.NET的路由系统
- Linux 备份与恢复
- 衬线字体与无衬线字体
- django for 前端_Django 前端Wbe框架
- MAPGIS提示请在“系统设置”里设置好系统库路径(SUVSLIB或者其他)再重新运行程序
- IQtree:使用 SNP 数据构建 有根 系统发育树及踩坑
- 用编程知识提高工作效率