斐波那契数列(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. 斐波那契数列通项公式的几种方法

    1.递归 2.动态规划 3.矩阵快速幂 转载于:https://www.cnblogs.com/umrx/p/8145954.html

  2. 斐波那契数列的Python实现

      斐波那契数列的Python实现:递归实现.非递归实现.斐波那契数列生成器: \[ \begin{equation} F(n)= \begin{cases} n & n=0, 1\\ F(n ...

  3. python实现斐波那契数列_斐波那契数列:python实现和可视化

    1 说明 ==== 1.1 斐波那契数列的介绍. 1.2 斐波那契数列是上帝的指纹,大自然中随处可见,目前广泛应用到黄金分割线的布局美和股市等预测等等. 1.3 斐波那契数列的Python的matpl ...

  4. 斐波那契数列的背景及解决方法

    斐波那契数列的背景及解决方法 背景: 前两天看到一道很有意思的数学题 假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖 ...

  5. python中斐波那契数列_斐波那契数列–在Python,JavaScript,C ++,Java和Swift中进行了解释...

    python中斐波那契数列 by Pau Pavón 通过保罗·帕文(PauPavón) The Fibonacci sequence is, by definition, the integer s ...

  6. python程序题斐波那契数列通项公式,Python斐波那契数列应用,编程练习题实例六...

    python斐波那契数列,本文是关于Python编程练习题和答案实例六,斐波那契数列应用的示例.引用百度关于斐波那契数列的介绍,大家先简单来的了解下,什么是斐波那契数列? 斐波那契数列(Fibonac ...

  7. 【斐波拉契数列】 Python

    [斐波拉契数列:这个数列从第三项开始,每一项都等于前两项之和] 题目内容:已知斐波拉契数列的前两项都是1, 我们定义求斐波拉契数列的第n项(n<=50)的函数为fbnq,程序主体如下:n=int ...

  8. python斐波那契数列函数,python—函数进阶-斐波那契数列

    上次说到生成器的调用next(),这样很不方便,需要手动调,我们一般是循环着调,while ,for都可以 a = (i for i in range(5)) for i in a: print(i) ...

  9. python中斐波那契系数实现的几种方法

    斐波那契系数的原理: 在第一个月有一对刚出生的小兔子,在第二个月小兔子变成大兔子并开始怀孕,第三个月大兔子会生下一对小兔子,并且以后每个月都会生下一对小兔子. 如果每对兔子都经历这样的出生.成熟.生育 ...

  10. JavaScript高级第2天:定义函数的三种方式、函数的原型链结构、完整原型链、作用域以及作用域链、函数的四种调用模式、闭包、计数器、斐波那契数列优化、三种继承方式

    JavaScript高级第二天 01-定义函数的三种方式 1.函数声明 function:可以先调用再声明,因为预解析(把函数声明.变量声明进行提升) function fn() {//函数体conl ...

最新文章

  1. 网络工程师_记录的一些真题_2016上半年上午
  2. spring线程并发处理(ThreadLocal)
  3. 在ListBox中添加ToggleButton(有IsChecked属性)
  4. elementui进度条如何设置_vue.js+ElementUI实现进度条提示密码强度效果
  5. Leetcode--560. 和为K的子数组
  6. 网站链接跳转安全警告提示l单页源码
  7. mysql 替换 汉字_MySQL替换文字
  8. Unreal Engine 4 中的 UI 优化技巧
  9. 牌组资源英语_「桌游推荐」如果当年有这种能背单词的桌游,我早就成英语学霸了...
  10. Docker系列(二):Docker安装
  11. java多线程系类:JUC原子类:04之AtomicReference原子类
  12. Android开发技术周报 Issue#102
  13. python关机_Python 神操作: 远程开机和关机
  14. ASP.NET的路由系统
  15. Linux 备份与恢复
  16. 衬线字体与无衬线字体
  17. django for 前端_Django 前端Wbe框架
  18. MAPGIS提示请在“系统设置”里设置好系统库路径(SUVSLIB或者其他)再重新运行程序
  19. IQtree:使用 SNP 数据构建 有根 系统发育树及踩坑
  20. 用编程知识提高工作效率

热门文章

  1. UE4 Pak打包、挂载、加载
  2. 中文邮件文本分类项目【简易上手的nlp实战项目】
  3. Android Studio微信app项目
  4. 微型计算机室内太干燥,室内干燥怎么办?8大方法来帮你解决
  5. Vue组件复用问题的一个解决方法
  6. springboot项目集成rabbitmq发送邮件功能,缓解服务器访问压力!
  7. Java 1.8 新特性——Stream 流的详细介绍
  8. java自定义动态代理
  9. 智能大棚工程建设设计方案
  10. SQL Server 版2004下半年度专家榜(揭帖时间为2004年下半年度)