提升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基于time模块求程序运行时间的方法
Sep 18 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
使用TFRecord存取多个数据案例
Feb 17 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
如何写python的配置文件
Jun 07 Python
python中rb含义理解
Jun 18 Python
python中remove函数的踩坑记录
Jan 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
PHP中ADODB类详解
2008/03/25 PHP
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
python实现ftp客户端示例分享
2014/02/17 Python
Python与shell的3种交互方式介绍
2015/04/11 Python
从0开始的Python学习016异常
2019/04/08 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
夏季药店促销方案
2014/08/22 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
致接力运动员加油稿
2015/07/21 职场文书
如何用python反转图片,视频
2021/04/24 Python
对Golang中的FORM相关字段理解
2021/05/02 Golang
Redis Lua脚本实现ip限流示例
2022/07/15 Redis