提升Python效率之使用循环机制代替递归函数


Posted in Python onJuly 23, 2019

斐波那契数列

当年,典型的递归题目,斐波那契数列还记得吗?

def fib(n):
  if n==1 or n==2:
    return 1
  else:
    return fib(n-1)+fib(n-2)

当然, 为了程序健壮性,加上 try...except...

def fib(n):
  if isinstance(n, int):
    print('兄弟,输入正整数哈')
    return
  try:
    if n==1 or n==2:
      return 1
    elif n <= 0:
      print('兄弟别输入0或负数呀')
    else:
      return fib(n-1)+fib(n-2)
  except RecursionError:
    print('兄弟,超过了最大递归深度'

是的,无论时间还是空间复杂度,递归真的是不太好使哈!这是递归的写法:

def fib(n):
  if n==1 or n == 2:
    return 1
  a, b = 1, 1
  for i in range(2, n):
    a, b = b, a+b
  return b

我稍微解释三点:

  • 为啥是 range(2, n) ,因为,斐波那契数列从 1 开始,所以 fib(n) 就是数列的第 n 项 
  • 由于前两项都为 1 ,所以要少两项,为 range(2, n) (要循环 n-2 次)
  • a, b = b, a+b 这里你也许也有困惑,我简单说说,一般Python解释器会将逗号分隔的变量直接看做一个元组, 
  • 又因为,解释器先执行等式右边的,所以,这样相当于 元组拆包
  • a, b = b, a+b 这句话的精髓在于,在等式右边将 b 视为 fib(n-2) ,将 a+b 视为 fib(n-1)

杨辉三角

同样,先写递归写法(我这里不考虑特殊情况了,时间有限):

def YH_tri(a, b):
  if a == b or b == 0:
    return 1
  else:
    return YH_tri(a-1, b)+YH_tri(a-1, b-1)

老铁们自己先想想该怎么写??

总结

以上所述是小编给大家介绍的提升Python效率之使用循环机制代替递归函数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
简单理解Python中的装饰器
Jul 31 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
PyCharm代码格式调整方法
May 23 Python
Python格式化日期时间操作示例
Jun 28 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
Python接口测试环境搭建过程详解
Jun 29 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
深入了解Django View(视图系统)
Jul 23 #Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 #Python
flask框架单元测试原理与用法实例分析
Jul 23 #Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 #Python
python实现socket+threading处理多连接的方法
Jul 23 #Python
简单了解Django ContentType内置组件
Jul 23 #Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 #Python
You might like
用PHP读取超大文件的实例代码
2012/04/01 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
php微信开发之图片回复功能
2018/06/14 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
基于JS组件实现拖动滑块验证功能(代码分享)
2016/11/18 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
python中selenium库的基本使用详解
2020/07/31 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
即将毕业大学生自荐信
2014/01/24 职场文书
应届生求职自荐信
2014/07/04 职场文书
街道务虚会发言材料
2014/10/20 职场文书
辞职信如何写
2015/02/27 职场文书
天堂的孩子观后感
2015/06/11 职场文书
社区低保工作总结2015
2015/07/23 职场文书
python实现剪贴板的操作
2021/07/01 Python