提升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调用windows api锁定计算机示例
Apr 17 Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
在Python中操作字典之update()方法的使用
May 22 Python
开源Web应用框架Django图文教程
Mar 09 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python列表倒序输出及其效率详解
Mar 04 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
PHP环境搭建最新方法
2006/09/05 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
jQuery ui 1.7更新小结
2009/08/15 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
Python实时获取cmd的输出
2015/12/13 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
Django中使用Celery的方法示例
2018/11/29 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
怎么快速自学python
2020/06/22 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
竞选生活委员演讲稿
2014/04/28 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
运动会通讯稿300字
2015/07/20 职场文书
高一数学教学反思
2016/02/18 职场文书
python 如何用terminal输入参数
2021/05/25 Python