提升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的Tornado框架中实现简单的在线代理的教程
May 02 Python
Python实现队列的方法
May 26 Python
Python判断直线和矩形是否相交的方法
Jul 14 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
Python Selenium参数配置方法解析
Jan 19 Python
Python如何使用turtle库绘制图形
Feb 26 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
python 指定源路径来解决import问题的操作
Mar 04 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
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
MSN消息提示类
2006/09/05 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
2017/03/08 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
pandas实现选取特定索引的行
2018/04/20 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
python调用java的jar包方法
2018/12/15 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
假面舞会策划方案
2014/05/29 职场文书
历史学专业求职信
2014/06/19 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
格林童话读书笔记
2015/06/30 职场文书