提升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实现定时同步本机与北京时间的方法
Mar 24 Python
Python使用CMD模块更优雅的运行脚本
May 11 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python+Wordpress制作小说站
Apr 14 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
python浪漫表白源码
Apr 05 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
python动态规划算法实例详解
Nov 22 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
DC动漫人物排行
2020/03/03 欧美动漫
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
jquery动态添加删除div 具体实现
2013/07/20 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
JS打印组合功能
2016/08/04 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
vue实现放大镜效果
2020/09/17 Javascript
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
python僵尸进程产生的原因
2017/07/21 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
感恩教师节演讲稿
2014/09/03 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书