提升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 相关文章推荐
python3中bytes和string之间的互相转换
Feb 09 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
Oct 15 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
Python socket模块实现的udp通信功能示例
Apr 10 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
粗暴解决CUDA out of memory的问题
May 22 Python
python数据处理之Pandas类型转换
Apr 28 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 动态添加记录
2009/03/10 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php中的观察者模式简单实例
2015/01/20 PHP
php中使用websocket详解
2016/09/23 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
python二分查找算法的递归实现方法
2016/05/12 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
python生成ppt的方法
2018/06/07 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
python调用摄像头的示例代码
2020/09/28 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
平面设计专业大学生职业规划书
2014/03/12 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
研发工程师岗位职责
2014/04/28 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
超市客服工作职责
2014/06/11 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript