提升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判断字符串与大小写转换
Jun 08 Python
python通过加号运算符操作列表的方法
Jul 28 Python
Python实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
在windows系统中实现python3安装lxml
Mar 23 Python
python中实现指定时间调用函数示例代码
Sep 08 Python
python中文件变化监控示例(watchdog)
Oct 16 Python
使用Python的turtle模块画图的方法
Nov 15 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
python获取栅格点和面值的实现
Mar 10 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
利用python为PostgreSQL的表自动添加分区
Jan 18 Python
Python编写冷笑话生成器
Apr 20 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
JavaScript脚本性能的优化方法
2007/02/02 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python绘制简单彩虹图
2018/11/19 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
python文件拆分与重组实例
2018/12/10 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
函授本科自我鉴定
2013/11/03 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
财务经理岗位职责
2015/01/31 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
MySQL的存储过程和相关函数
2022/04/26 MySQL