正文共: 3269字 8图

预计阅读时间: 9分钟

每日分享

The great pleasure in life is doing what people say you cannot do.

人生最大的快乐就是做到别人认为你做不到的事情。

小闫语录:

当我们鼓起勇气去做一件事情的时候,耳边总是会有这么一个声音『你不适合做。/你肯定不行的。/你做梦呢吧?......』各种各样类似的打击。它们让我们丧失信心,甚至怀疑自己。你要明白,这个世界上最懂你的人,不是朋友,不是亲戚,是你自己!你自己最有发言权。如果认定,请坚持。你要做的,就是做到他们认为你做不到的事情,不是为了向他们证明自己,而是告诉自己『我的人生我做主,我说行,不行也行!』

python实现斐波那契数列的多种方式

斐波那契数列

1,1,2,3,5,8,13,21,34,55,89,144,233,377.....这个数列就是大名鼎鼎的斐波那契数列。它被称为黄金分割数列,在面试中也没少碰到它。巴拉巴拉......假装我介绍了很多,下面直接看干货。

首先我们引入一下时间复杂度这个概念,这个是检验算法所耗时间的长短。检验代码的质量终究还是要看算法的。因为下文中我们需要用时间复杂度衡量一下各算法的效率怎么样,寻找一种最优方法。

上图代表的是大量数据的增加,函数所耗费的时间怎么样。Element元素

operations 运算,作用

Big-O Complexity Chart 大O表示法时间复杂度图

最简单的实现a, b= 0, 1

while b < 1000:

print(b,end=',')

a, b = b, a+b

这个就是我们在初学python时的一种写法,随着我们学习的深入了解,我们也用到了不同的方法实现。

函数实现

1.递推法

首先忽略我代码中无聊的注释方法,哈哈哈~~~~##############################

# 使用`递推法`实现斐波那契数列 #

#############################

def fib_next(n):

first_number = 0

second_number = 1

for _ in range(n):

first_number, second_number = second_number, first_number+second_number

return first_number

if __name__ == '__main__':

[print(fib_next(i),end=',') for i in range(1,15)]据说这种方法的时间复杂度是O(n),从图表中对应查看,可以得知这种方法随着数量的增加,速度会越来越慢越来越慢,显然是不可取的。

2.递归法##############################

# 使用`递归法`实现斐波那契数列 #

#############################

def fib_recursive(n):

assert n >= 0, "n must be larger than 0"

if n <= 1:

return n

return fib_recursive(n-1) + fib_recursive(n-2)

if __name__ == '__main__':

[print(fib_recursive(i),end=',') for i in range(1,15)]这种写法最简单,相对来说很好理解。但是效率却相当的低......,时间复杂度是O(1.618^n)

3.生成器##############################

# 使用`生成器`实现斐波那契数列 #

#############################

def fib_generator(max):

first_number, second_number = 0, 1

while max > 0:

first_number, second_number = second_number, first_number+second_number

max -= 1

yield first_number

if __name__ == '__main__':

[print(i,end=',') for i in fib_generator(15)]使用生成器的方法是一种不错的想法。但是仍然不是最好的。

4.矩阵

在看下面的两种方法之前,我们先来看一下矩阵,这是线性代数里面的一块内容。下面简单的解释一下矩阵乘法:

图中左数第一个矩阵的第一行每个元素和第二个矩阵的这一列每个元素做如下的运算:2 * 1 + 1 * 0 = 2

得到的2作为第三个矩阵的第一行第一列的元素值。同理:1 * 1 + 0 * 0 = 1

第三个矩阵的第二行第一列的元素值为1。因此两个矩阵相乘得到第三个矩阵。

4.1第一种方法############################

# 使用`矩阵`实现斐波那契数列 #

###########################

import numpy

def fib_matrix(n):

res = pow((numpy.matrix([[1, 1], [1, 0]])), n) * numpy.matrix([[1], [0]])

return res[0][0]

if __name__ == '__main__':

[print(int(fib_matrix(i)), end=',') for i in range(10) ]因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n)

4.2第二种方法##########################

# 使用矩阵计算斐波那契数列 #

#########################

import numpy

def Fibonacci_Matrix_tool(n):

Matrix = numpy.matrix("1 1;1 0")

# 返回的是matrix类型

return pow(Matrix, n)

def Fibonacci_Matrix(n):

result_list = []

for i in range(0, n):

result_list.append(numpy.array(Fibonacci_Matrix_tool(i))[0][0])

return result_list

# 调用

if __name__ == '__main__':

a = Fibonacci_Matrix(10)

print(a)用科学计算包numpy来实现矩阵法 O(log n)

类实现

1.类#######################################

# `类内实现内部魔法方法`实现斐波那契数列 #

######################################

class Fibonacci(object):

def __init__(self, num):

self.num = num

def __iter__(self):

if self.num < 1:

return 1

first_number, second_number = 0, 1

while self.num > 0:

first_number, second_number = second_number, first_number + second_number

self.num -= 1

yield first_number

def __next__(self):

return self.__iter__()

if __name__ == '__main__':

f = Fibonacci(15)

[print(i,end=',') for i in f]参考文献:

https://www.cnblogs.com/wj-1314/p/8490822.html

https://www.cnblogs.com/panlq/p/9307203.html

优质文章推荐:

斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式相关推荐

  1. 斐波那契数列python递归 0、1、1、2、3_python: 递归和递推方法求斐波那契数列

    1.  斐波那契数列 序号 0 1 2 3 4 5 6... 数列 0 1 1 2 3 5 8... 2.  三种程序 import time time1 = time.clock() #斐波那契数列 ...

  2. Python教程:去除背景,我保证不动她一根头发(附多种方式)

    导语 所有人,请大家收起魔术棒:你不知道Python也能去除"背景"嘛? 修饰图片中的头发是设计师最烦人的任务之一!要修得完美,不破坏原图,需要注意的小细节实在 太多了.如果还要去 ...

  3. python 递归方式实现斐波那契数列

    python 递归方式实现斐波那契数列 import time t1=time.time() def factorial(n):if n==1 or n==2:return 1else:return ...

  4. python编写递归函数和非递归函数、输出斐波那契数列_python 入门之斐波那契数列递归表达式算法和非递归算法...

    题目: 斐波那契数列是一组有规律的数列:1,1,2,3,5,8,13,--..,那么我们怎么用python 来完成此算法,并求出第200位的值是多少 1.python 递归表达式实现: def fib ...

  5. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

  6. Python输出斐波那契数列【递归、迭代】

    Python输出斐波那契数列[递归.迭代] 首先 斐波那契数列的定义是什么? 斐波那契数列指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波那契数列以如下被以递推的方 ...

  7. 用python函数写斐波那契数列非递归,python 入门之斐波那契数列递归表达式算法和非递归算法...

    题目: 斐波那契数列是一组有规律的数列:1,1,2,3,5,8,13,........,那么我们怎么用python 来完成此算法,并求出第200位的值是多少 1.python 递归表达式实现: def ...

  8. 斐波那契数列(递归+源码+注释)

    斐波那契数列(递归+源码+注释) 公元 1202 年,意大利数学家莱昂纳多·斐波那契提出了具备以下特征的数列: 前两个数的值分别为 0 .1 或者 1.1: 从第 3 个数字开始,它的值是前两个数字的 ...

  9. 用递归调用法求斐波那契函数_进阶版:面试官问你斐波那契数列的时候不要高兴得太早...

    增加内容 递归改进版 矩阵快速幂解法 通项表达式解法 列表法 斐波那契数列应用 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归 ...

最新文章

  1. 脑机接口拼写器是否真的安全?华中科技大学研究团队对此做了相关研究
  2. 这些 Linux 的 “自动化” 技巧,教你轻松完成任务
  3. Python列表的常用你操
  4. ios开发网络篇—HTTP协议 - 转
  5. 通过FD耗尽实验谈谈使用HttpClient的正确姿势
  6. Codeforces Round #480 (Div. 2) B. Marlin
  7. Java中为什么使用事务?什么时候使用事务?如何使用事务?
  8. 判断玩家是否开全图挂
  9. HTML5系列代码:Visual Studio Code(简称 VS Code)是一个由微软开发
  10. 腾讯IVWEB团队:如何搭建高质量、高效率的前端工程体系 页面结构继承
  11. c udp文件发送到服务器端,基于UDP的客户端和服务器端的代码设计
  12. ORACLE安装方法
  13. 肌营养不良2020-2021最新治疗突破 肌营养不良2021最新进展
  14. linux监控硬件温度(CPU和GPU等)
  15. 第二章:大数据文件系统之HDFS-CSDN就业班-专题视频课程
  16. Thinkpad笔记本散热器与风扇的寿命与清理问题
  17. 【IT软件专利】---专利编写步骤
  18. 【回溯法】八皇后问题
  19. 数字信号处理的MATLAB实践(一)语音信号的录制和读取
  20. Python中r+,w+,a+的区别

热门文章

  1. 【Java集合学习系列】HashMap实现原理及源码分析
  2. JavaScript实现表单的分向提交
  3. Hadoop HDFS概念学习系列之shell命令使用HDFS的一些其他命令(十九)
  4. iOS工程引入ios-charts-master
  5. 产后抑郁症的食疗方法有什么
  6. 各种版本的ST-LINK仿真器
  7. 如何快速实现Mathematica和Mathtype之间的切换
  8. mac iTunes启动失败,声称iTunes文件夹被锁定
  9. 【图】IPAVS多媒体网络×××
  10. CentOS Squid