位置: 编程技术 - 正文

用Python实现斐波那契(Fibonacci)函数(python编写一个函数求斐波那契)

编辑:rootadmin

推荐整理分享用Python实现斐波那契(Fibonacci)函数(python编写一个函数求斐波那契),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:如何用python做斐波那契数列,pyhone实现斐波,python编写一个函数求斐波那契,python编写一个函数求斐波那契,pyhone实现斐波,用python写斐波那契,python编写一个函数求斐波那契,pyhone实现斐波,内容如对您有帮助,希望把文章链接给更多的朋友!

Fibonacci斐波那契数列,很简单,就是一个递归嘛,学任何编程语言可能都会做一下这个。

最近在玩Python,在粗略的看了一下Learning Python和Core Python之后,偶然发现网上有个帖子Python程序员的进化写的很有意思。于是打算仿照一篇,那篇帖子用了十余种方法完成一个阶乘函数,我在这里会用九种不同的风格写出一个Fibonacci函数。

要求很简单,输入n,输出第n个Fibonacci数,n为正整数

下面是这九种不同的风格:

1)第一次写程序的Python程序员:

说明:第一次写程序的人往往遵循人类语言的语法而不是编程语言的语法,就拿我一个编程很猛的哥们来说,他写的第一个判断闰年的程序,里面直接是这么写的:如果year是闰年,输出year是闰年,否则year不是闰年。

2)刚学Python不久的的C程序员:

说明:在刚接触Python时,用缩进而非大括号的方式来划分程序块这种方式我是很不适应的,而且每个语句后面没有结束符,所以每次写完一个Python函数之后干的第一件事一般就是一边注释大括号,一边添加漏掉的冒号。

3)懒散的Python程序员:

说明:看了Learning Python之后,才知道Python没有三元操作符?,不过鉴于Python里bool值比较特殊(有点像C,非零即真,非空即真),再加上Python的逻辑语句也是支持短路求值(Short-Circuit Evaluation)的,这就可以写出一个仿?语句出来。

4)更懒的Python程序员:

说明:lambda关键字我曾在C#和Scheme里面用过,Python里面的lambda比C#里简便,并很像Scheme里的用法,所以很快就适应了。在用Python Shell声明一些小函数时经常用这种写法。

5)刚学完数据结构的Python程序员:

说明:前面的Fibonacci函数都是树形递归的实现,哪怕是学一点算法就应该知道这种递归的低效了。在这里从树形递归改为对应的迭代可以把效率提升不少。Python的元组赋值特性是我很喜欢的一个东东,这玩意可以把代码简化不少。举个例子,以前的tmp=a;a=b;b=tmp;可以直接用一句a,b=b,a实现,既简洁又明了。

用Python实现斐波那契(Fibonacci)函数(python编写一个函数求斐波那契)

6)正在修SICP课程的Python程序员:

说明:在这里我使用了Scheme语言中很常见的尾递归(Tail-recursion)写法。Scheme里面没有迭代,但可以用不变量和尾递归来模拟迭代,从而实现相同的效果。不过我还不清楚Python有没有对尾递归做相应的优化,回头查一查。PS:看过SICP的同学,一眼就能看出,这个程序其实就是SICP第一章里的一个例子。

7)好耍小聪明的Python程序员:

说明:基本的逻辑和上面的例子一样,都是尾递归写法。主要的区别就是利用了Python提供的默认参数和三元操作符,从而把代码简化至一行。至于默认参数,学过C++的同学都知道这玩意,至于C#4.0也引入了这东东。

8)刚修完线性代数的Python程序员:

说明:这段代码就不像之前的代码那样清晰了,所以先介绍下原理(需要一点线性代数知识):首先看一下之前的迭代版本的Fibonacci函数,很容易可以发现存在一个变换:y->x, x+y->y。换一个角度,就是[x,y]->[y,x+y]。在这里,我声明一个二元向量[x,y]T,它通过一个变换得到[y,x+y]T,可以很容易得到变换矩阵是[[1,0],[1,1]],也就是说:[[1,0],[1,1]]*[x,y]T=[y,x+y]T令二元矩阵A=[[1,0],[1,1]],二元向量x=[0,1]T,容易知道Ax的结果就是下一个Fibonacci数值,即:Ax=[fib(1),fib(2)]T亦有:Ax=[fib(2),fib(3)]T………………以此类推,可以得到:

也就是说可以通过对二元向量[0,1]T进行n次A变换,从而得到[fib(n),fib(n+1)]T,从而得到fib(n)。

在这里我定义了一个二元矩阵的相乘函数m1,以及一个在二元向量上的变换m2,然后利用reduce操作完成一个连乘操作得到A&#;x,最后得到fib(n)。

9)准备参加ACM比赛的Python程序员:

说明:

看过上一个fib函数就比较容易理解这一个版本了,这个版本同样采用了二元变换的方式求fib(n)。不过区别在于这个版本的复杂度是lgn,而上一个版本则是线性的。

这个版本的不同之处在于,它定义了一个矩阵的快速求幂操作fib_iter,原理很简单,可以类比自然数的快速求幂方法,所以这里就不多说了。

PS:虽然说是ACM版本,不过说实话我从来没参加过那玩意,毕竟自己算法太水了,那玩意又太高端……只能在这里YY一下鸟~

python中,最基本的那种递归(如下fib1)效率太低了,只要n数字大了运算时间就会很长;而通过将计算的指保存到一个dict中,后面计算时直接拿来使用,这种方式成为备忘(memo),如下面的fib2函数所示,则会发现效率大大提高。

在n=以内时,fib1和fab2运行时间都很短看不出差异,但当n=时,就太明显了,fib1运行花了秒,fab2运行只花费了0.秒。n=时,输出如下:

这两个计算Fibonacci数列的函数,如下: way,我现在还没有什么体会,毕竟还没用Python写过什么真正的程序。Learning Python和Core Python都是不错的Python入门书籍,前者更适合没有编程基础的人阅读。Python是最好的初学编程入门语言,没有之一。所以它可以取代Scheme成为MIT的计算机编程入门语言。

python Django批量导入不重复数据 本文为大家分享了pythonDjango批量导入不重复数据的实现代码,供大家参考,具体内容如下程序如下:#coding:utf-8importosos.environ.setdefault("DJANGO_SETTINGS_MODULE",

python Django批量导入数据 前言:这期间有研究了Django网页制作过程中,如何将数据批量导入到数据库中.这个过程真的是惨不忍睹,犯了很多的低级错误,这会在正文中说到的.再者导

python Django框架实现自定义表单提交 除了使用Django内置表单,有时往往我们需要自定义表单。对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误"CSRFverificationfailed.Request

标签: python编写一个函数求斐波那契

本文链接地址:https://www.jiuchutong.com/biancheng/384404.html 转载请保留说明!

上一篇:Python基础教程之正则表达式基本语法以及re模块(python基础教程chm)

下一篇:python Django批量导入不重复数据(django批量创建数据)

  • 外轮供应公司远洋运输供应公司的退税申报?
  • 小规模纳税人怎么变成一般纳税人
  • 短期借款利息都需要测算什么
  • 增值税怎样报税
  • 库存盘盈如何入账
  • 税务自查补缴税款算滞纳金么
  • 主营业务收入具体是什么
  • 为什么增值税可以抵扣
  • 三类小规模纳税标准
  • 公司办公楼的中介怎么做
  • 没有进出口权可以做外贸吗
  • 购买机动车怎样抵扣进项税
  • 预缴所得税多交了汇算时可以抵扣下一年的所得税吗
  • 去国外参加展会带什么东西
  • s24evmon.exe - s24evmon是什么进程 有什么用
  • php怎么自学
  • 餐饮发票可以计入什么费用
  • 抵扣农产品进项税时,也要抵扣运费吗
  • 退回的企业所得税怎么做账
  • 增值税中非经营活动包括哪些
  • win10设置待机时间长怎么在哪里设置
  • php怎么读取txt
  • php autoloader
  • 最小的电脑是多少寸的
  • windows环境下,ping的功能和使用方法
  • php请求https
  • 企业向个人借款是否合法
  • 高德地图api是什么意思
  • vue–router
  • php zmq
  • 三方债权债务抵销
  • 电脑学word下哪个软件视频
  • 中小企业的资产负债率均值是多少
  • 残保金补申报后处罚会自动取消吗
  • 待处理财产损溢增加是哪方
  • 广告公司纳税人类型
  • 个人以不动产投资成立一人有限公司
  • 低值易耗品在年报上怎么看的
  • 财务状况简单说明
  • 发票可以付款前开吗
  • 资产减值损失属于什么科目
  • 工资包含福利费吗
  • 取得土地使用权所支付的金额包括契税吗
  • 如何把access数据库导入excel
  • 出口退免税的税种包括增值税消费税企业所得税
  • 物业公司维修服务范围
  • 库存商品结转成本是什么意思
  • 原材料用于在建工程要进项转出吗
  • 子公司注销母公司收回现金流
  • 预计负债初始计量的最佳估计数的确定
  • 受托开发软件一般做什么
  • 所得税会计凭证包括哪些
  • 独立核算的重要性
  • 外贸企业需要取得什么资质
  • 增值税专用发票开了有什么用
  • 城市天然气管道爆炸
  • windowsold文件夹在哪里
  • window10预览在哪里找
  • 密码多次错误被锁定怎么办
  • linux的安装流程和详细内容
  • win8系统崩溃无法开机
  • win8 怎么样
  • 怎么调用windows api
  • cocos2dx 3.3 + QT5.3制作游戏编辑器
  • html模板 js
  • 解决胃胀气最快方法
  • nodejs链接mysql
  • js 图像
  • socketio视频教程
  • json convert
  • jquerydom操作
  • jQuery之简单的表单验证实例
  • java script js
  • 源代码举例
  • 税收分类分级管理后如何开展风险管理
  • 单位车辆购置税怎么申报缴纳
  • 四川省税务局税费服务支持中心工作人员编制
  • 税务局发票邮寄需要多久
  • 购销合同印花税最新政策2023
  • 计提印花税入什么科目核算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设