斐波那契数列的5种python写法

斐波那契数列(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*)

斐波那契数列,难点在于算法,还有如果变成生成器,generator,就要用for循环去遍历可迭代的generator

第一种 递归法

def fib_recur(n):assert n >= 0, "n > 0"if n <= 1:return nreturn fib_recur(n-1) + fib_recur(n-2)for i in range(1, 20):print(fib_recur(i), end=' ')

写法最简洁,但是效率最低,会出现大量的重复计算,时间复杂度O(1.618^n),而且最深度1000

第二种 递推法

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),呈线性增长,如果数据量巨大,速度会越拖越慢

第三种 生成器

def fib_loop_while(max):a, b = 0, 1while max > 0:a, b = b, a + bmax -= 1yield afor i in fib_loop_while(10):print(i)

带有yield的函数都被看成生成器,生成器是可迭代对象,且具备__iter__ 和 __next__方法, 可以遍历获取元素
python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可

第四种 类实现内部魔法方法

class Fibonacci(object):"""斐波那契数列迭代器"""def __init__(self, n):""":param n:int 指 生成数列的个数"""self.n = n# 保存当前生成到的数据列的第几个数据,生成器中性质,记录位置,下一个位置的数据self.current = 0# 两个初始值self.a = 0self.b = 1def __next__(self):"""当使用next()函数调用时,就会获取下一个数"""if self.current < self.n:self.a, self.b = self.b, self.a + self.bself.current += 1return self.aelse:raise StopIterationdef __iter__(self):"""迭代器的__iter__ 返回自身即可"""return selfif __name__ == '__main__':fib = Fibonacci(15)for num in fib:print(num)

for循环的本质是通过不断调用next()函数实现的

    for x in [1, 2, 3, 4, 5]:pass

相当于:

    # 首先获取可迭代对象it = iter([1, 2, 3, 4, 5])# while nextwhile True:try:next(it)except StopIteration:# 遇到StopIteration就退出循环break

第五种 矩阵快速幂

import numpy as np### 1
def fib_matrix(n):for i in range(n):res = pow((np.matrix([[1, 1], [1, 0]], dtype='int64')), i) * np.matrix([[1], [0]])print(int(res[0][0]))# 调用
> fib_matrix(50)### 2
# 使用矩阵计算斐波那契数列
def Fibonacci_Matrix_tool(n):Matrix = np.matrix("1 1;1 0", dtype='int64')# 返回是matrix类型return np.linalg.matrix_power(Matrix, n)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# 调用
> Fibonacci_Matrix(50)### pow 速度 比 双**号快, np.linalg.matrix_power也是一种方法

因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n)
用科学计算包numpy来实现矩阵法 O(log n)

斐波那契数列的5种python写法相关推荐

  1. “斐波那契数列”的两种算法

    "斐波那契数列"的两种算法 斐波那契数列有个规律:从第三个数开始,每个数是前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55...... 现在通过两种方式(递归与 ...

  2. Python中斐波那契数列的四种写法

    在这些时候,我可以附和着笑,项目经理是决不责备的.而且项目经理见了孔乙己,也每每这样问他,引人发笑.孔乙己自己知道不能和他们谈天,便只好向新人说话.有一回对我说道,"你学过数据结构吗?&qu ...

  3. 斐波拉契数列 Java三种实现

    对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...

  4. python中求斐波那契数偶数和_[译] 斐波那契数列中的偶数 (Python vs. JavaScript)

    斐波那契数列中的偶数 (Python vs. JavaScript) 对于雇主来说,用某种方式来生成斐波那契数列是一道热门的面试题.而求斐波那契数列中的所有偶数便是其热门的变体之一.这里,我将用 Py ...

  5. 斐波那契数列的四种实现

    来自:Crossin的编程教室 孔乙己自己知道不能和他们谈天,便只好向 Intern 说话.有一回对我说道,"你写过代码么?"我略略点一点头.他说,"写过代码,--我便考 ...

  6. 剑指Offer #07 斐波那契数列(四种解法)| 图文详解

    题目来源:牛客网-剑指Offer专题 题目地址:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 题目解析 ...

  7. php算法求出兔子数列,PHP算法:斐波那契数列的N种算法

    前言 前段时间,遇到优化计算斐波那契数列的常规递归方法,但是一时间并没有及时想到很好的方法,所以后面查找了相关资料,总结了多种计算解法,所以分享出来,和大家一起交流学习. 斐波那契数是什么 斐波那契数 ...

  8. C语言中经典算法——斐波那契数列的几种算法

    斐波那契数列的递推公式: 我们尝试计算斐波那契数列的第n项并输出. 1.递归法 #include<stdio.h> int fib(int m) {if(m>=3){return f ...

  9. 斐波那契数列的四种实现方式(C语言)

    斐波那契数列是一组第一位和第二位为1,从第三位开始,后一位是前两位和的一组递增数列, 像这样的:1.1.2.3.5.8.13.21.34.55...... 今天,我们用四种方式来进行实现: 1.递归 ...

  10. C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

    众所周知,斐波那契数列是非常经典的一个数列,它的数学公式如下 为了便于观察,我们列出它的几项:0  1  1  2  3  5  8  13  21...... 下面我们将介绍四种方法来用C语言计算机 ...

最新文章

  1. jieba中文分词源码分析(四)
  2. 2021-06-06
  3. asp.net core 2使用本地https证书
  4. Linux 查看和删除进程
  5. case class到底啥用
  6. apache spark_Apache Spark软件包,从XML到JSON
  7. 创建线程的第二种方法(实现Runnable接口)
  8. springboot python 开发效率比较-2018年Java开发值得学习的10大技术
  9. HG8120C 端口映射 配置家用服务器
  10. ubuntu查看实时网速
  11. Java Spring MVC框架 VIII 之 Spring MVC拦截器
  12. 悲观锁、乐观锁以及分布式锁
  13. uniapp打开外部应用如:浏览器、淘宝、 微信方法
  14. Ubuntu18.04更换开机登录界面壁纸
  15. NASM: Register 寄存器
  16. Teamcenter8 更改料号所有者操作
  17. 字是人的脸,可我就是写不好
  18. 文化中国 系列六:读历史,说帝王
  19. 财务盈利、偿债能力指标
  20. 一图解千言,从兴趣意念直达搜索目标!

热门文章

  1. java已过期如何继续运行_您的安全设置已阻止应用程序使用过期或过期的Java版本运行...
  2. iOS开发之功能模块--高仿Boss直聘的IM界面交互功能
  3. Android Wear 进阶 2 Creating Wearable Apps-创建手表程序
  4. [玩转BLE]标准GATT服务列表
  5. 017:函数:Python的乐高积木
  6. python掷骰子while循环_初学者Python:骰子游戏,while循环实现
  7. 转载:关于互联网金融授信产品的风控建模
  8. bcc校验位怎么算的_BCC校验码(异或校验码,异或求和)在线计算器_三贝计算网_23bei.com...
  9. hc32和stm32 can波特率设置
  10. 4 查询网站是否收录和利用百度做网站推广