在这些时候,我可以附和着笑,项目经理是决不责备的。而且项目经理见了孔乙己,也每每这样问他,引人发笑。孔乙己自己知道不能和他们谈天,便只好向新人说话。有一回对我说道,“你学过数据结构吗?”我略略点一点头。他说,“学过数据结构,……我便考你一考。斐波那契数列用Python怎样写的?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些字应该记着。将来做项目经理的时候,写账要用。”我暗想我和项目经理的等级还很远呢,而且我们项目里也用不到斐波那契数列;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是f(n) = f(n-1)+f(n-2)吗?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着办公桌,点头说,“对呀对呀!……斐波那契数列在python中有四种写法,你知道么?”我愈不耐烦了,努着嘴走远。孔乙己刚拿出笔记本电脑,想要写几段程序,见我毫不热心,便又叹一口气,显出极惋惜的样子。

斐波那契数列的定义

f(0) = 1,f(1) = 1,f(n) = f(n-1) + f(n-2)

CODE

本次介绍Python中斐波那契数列的四种写法,第一种写法比较常见,第二种写法也比较常见.(鲁迅听了想打人).咳咳.第一种依赖于递归,第二种依赖与循环,前两种算法都是可以在几乎所有编程语言里面都能都快速移植的.我们先从这两种介绍

第一种:递归

# 递归
def Fibonacci_Recursion_tool(n):
if n <= 0:
return 0
elif n == 1:
return 1
else:
return Fibonacci_Recursion_tool(n - 1) + Fibonacci_Recursion_tool(n - 2) def Fibonacci_Recursion(n):
result_list = []
for i in range(1, n + 1): result_list.append(Fibonacci_Recursion_tool(i))
return result_list

性能比较

这里我们使用time函数进行计时.并使用numpy类库保存到文件中

def Test_Fibonacci(n, list):
t1 = time.clock()
Fibonacci_Recursion(n)
t2 = time.clock()
l1 = t2 - t1 t1 = time.clock()
Fibonacci_Loop(n)
t2 = time.clock()
l2 = t2 - t1 t1 = time.clock()
Fibonacci_Yield(n)
t2 = time.clock()
l3 = t2 - t1 t1 = time.clock()
Fibonacci_Matrix(n)
t2 = time.clock()
l4 = t2 - t1
list.append([l1,l2, l3, l4])
print("第%d次的测试结果为:" % n, [l1,l2, l3, l4]) def Test_Save(times_items, filename):
times_list = []
for i in range(1, times_items + 1): Test_Fibonacci(i, times_list)
np.savetxt(filename, times_list) def Test_Print(Test_Print_n):
print(Fibonacci_Recursion(Test_Print_n))
print(Fibonacci_Loop(Test_Print_n))
print(Fibonacci_Yield(Test_Print_n))
print(Fibonacci_Matrix(Test_Print_n)) times_items = 40
filename = "/home/fonttian/Data/17_DS_AI/Fibonacci/Fibonacci_all.txt"
# Test_Save(times_items,filename)

从效果来看第一种效果最差在35以上的运算次数时,耗时就会达到1s,而其他的计算速度则仍然在十的负五次方到负六次方之间,当次数大于1000时,loop的速度开始明显不足.

而在pow(10000,10000)时,矩阵与yield的计算速度则为

0.27840600000000004
1.6000000000016e-05

看来还是yield性能好一些,但是实际上并不是,因为yield和np.Matrix实际上的运算机制导致,其实在大数量级运算时,各存在一个问题,yield实际上是没有运算?np.Matrix 则出现了内存溢出(导致的数值错误)

不过整体而言,最好的还是yield,这是python出色设计的功劳.

Python中斐波那契数列的四种写法的更多相关文章

  1. Python中斐波那契数列的赋值逻辑

    斐波那契数列 斐波那契数列又称费氏数列,是数学家Leonardoda Fibonacci发现的.指的是0.1.1.2.3.5.8.13.21.34.······这样的数列.即从0和1开始,第n项等于第 ...

  2. 实现斐波拉契数列的四种方式python代码

    斐波那契数列 1. 斐波拉契数列简介 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引 ...

  3. python基础----斐波那契数列

    python实现斐波那契数列的三种方法 """ 斐波那契数列 0,1,1,2,3,5,8,13,21,... """ # 方法一:while ...

  4. 斐波那契数列的5种python实现写法

    斐波那契数列的5种python写法       斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖 ...

  5. python实现斐波那契数列(Fibonacci sequence)

    使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...

  6. 斐波那契数列的三种C++实现及时间复杂度分析

    本文介绍了斐波那契数列的三种C++实现并详细地分析了时间复杂度. 斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1) + F(n-2) (n>2) 如何计算斐波那契数 F( ...

  7. Python——通过斐波那契数列来理解生成器

    一.生成器(generator) 先来看看一个简单的菲波那切数列,出第一个和第二个外,任意一个数都是由前两个数相加得到的.如:0,1,1,2,3,5,8,13...... 输入斐波那契数列前N个数: ...

  8. python之斐波那契数列递归推导在性能方面的反思

    在各种语言中,谈到递归首当其冲的是斐波那契数列,太典型了,简直就是标杆 一开始本人在学习递归也是如此,因为太符合逻辑了 后台在工作和学习中,不断反思递归真的就好嘛? 首先递归需要从后往前推导,所有数据 ...

  9. python实现斐波那契数列

    https://www.cnblogs.com/wolfshining/p/7662453.html 斐波那契数列即著名的兔子数列:1.1.2.3.5.8.13.21.34.…… 数列特点:该数列从第 ...

随机推荐

  1. List<String> bikeList = Arrays.asList(bikeuuids);

    最近项目中  List<String> bikeList = Arrays.asList(bikeuuids);报错 而且console里面没有特别有用的 bikeList.add(&qu ...

  2. mvc area出现“找到多个与名为“Home”的控制器匹配的类型”错误的解决方法

    出现该问题的原因是在默认的Golbal.asax.cs文件中已经注册了默认路由 public class MvcApplication : System.Web.HttpApplication    ...

  3. appium简明教程(2)——appium的基本概念

    Client/Server Architecture appium的核心其实是一个暴露了一系列REST API的server. 这个server的功能其实很简单:监听一个端口,然后接收由client发 ...

  4. Python之杨辉三角算法实现

    学习了廖雪峰的官方网站的python一些基础,里面有个题目,就是让写出杨辉三角的实现,然后我就花了时间实现了一把.思路也很简单,就是收尾插入0,然后逐层按照杨辉三角的算法去求和实现杨辉三角. 附属代码 ...

  5. Oracle中文乱码解决办法总结

    AMERICAN_AMERICA.WE8ISO8859P1,这个字符编码是西欧字符编码,对应于.Net的就是iso-8859-1字符编码,所以只需要改到系统的默认字符编码就行了. 解决方法: (1) ...

  6. CentOS 7.3 系统安装配置图解教程

    一.安装CentOS 7.3 CentOS 7.x系列只有64位系统,没有32位.生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 成功引导系统后,会出现下面的界 ...

  7. stm8 时钟输出引脚

    CLK_CCO引脚是STM8的时钟输出引脚,若设置该脚输出主时钟Fmaster,时钟输出寄存器可以进行如下操作 CLK->CCOR=0X19;

  8. Android Developers:支持不同的屏幕密度

    这节课程向你展示如何通过提供不同的资源和使用与分辨率无关的测量单位,支持不同屏幕密度. 使用密度无关的像素 —————————————————————————————————————————————— ...

  9. Appium 设置手机连接方式

    使用appium的 Connection 和driver 的setConnection方法,可以切换手机的上网方式 // 切换到wifi Connection cnn = Connection.WIF ...

  10. 独立的android开发者开发app如何盈利?

    对立android开发者开发app如何盈利?android开发日益兴隆,随着google的大力推广和技术及其android培训的支持,android个人开发者或者android独立开发者也都匆匆欲动加 ...