提升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+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
python实现Windows电脑定时关机
Jun 20 Python
Flask模拟实现CSRF攻击的方法
Jul 24 Python
Tesserocr库的正确安装方式
Oct 19 Python
python机器人运动范围问题的解答
Apr 29 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
python调用matplotlib模块绘制柱状图
Oct 18 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
python中property和setter装饰器用法
Dec 19 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
浅析Python __name__ 是什么
Jul 07 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 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
php 删除cookie和浏览器重定向
2009/03/16 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
php计算整个目录大小的方法
2015/06/01 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
javascript 小数乘法结果错误的处理方法
2016/07/28 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
PyQt5每天必学之弹出消息框
2018/04/19 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
中国跨境电商:Tomtop
2017/03/16 全球购物
2014年基层党组织公开承诺书
2014/03/29 职场文书
投资建议书模板
2014/05/12 职场文书
安全演讲稿开场白
2014/08/25 职场文书
毕业生实习证明
2014/09/19 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
党支部意见范文
2015/06/02 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
小学思想品德教学反思
2016/02/24 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
python实现简单的井字棋
2021/05/26 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python