提升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之wxPython菜单使用详解
Sep 28 Python
Python 迭代器工具包【推荐】
May 06 Python
解决uWSGI的编码问题详解
Mar 24 Python
django中send_mail功能实现详解
Feb 06 Python
PYTHON基础-时间日期处理小结
May 05 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
Eclipse配置python默认头过程图解
Apr 26 Python
python interpolate插值实例
Jul 06 Python
python合并多个excel文件的示例
Sep 23 Python
python制作图形界面的2048游戏, 基于tkinter
Apr 06 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
桌面中心(一)创建数据库
2006/10/09 PHP
使用PHP获取汉字的拼音(全部与首字母)
2013/06/27 PHP
php 如何获取数组第一个值
2013/08/06 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
python MD5加密的示例
2020/10/19 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
机电专业体育教师求职信
2013/09/21 职场文书
物理系毕业生自荐信
2013/11/01 职场文书
《小池塘》教学反思
2014/02/28 职场文书
社会调查研究计划书
2014/05/01 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
Golang并发工具Singleflight
2022/05/06 Golang