提升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聚类算法之基本K均值实例详解
Nov 20 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
Python版名片管理系统
Nov 30 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
python global和nonlocal用法解析
Feb 03 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
Opencv中cv2.floodFill算法的使用
Jun 18 Python
详解PyTorch模型保存与加载
Apr 28 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
php根据日期显示所在星座的方法
2015/07/13 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
appium+python adb常用命令分享
2020/03/06 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
Linux的文件类型
2016/07/05 面试题
成教自我鉴定
2013/10/27 职场文书
销售顾问的岗位职责
2013/11/13 职场文书
实验心得体会
2014/09/05 职场文书
学籍证明模板
2014/11/21 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫