提升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的几种标准输出重定向方式
Aug 15 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
python中pip的安装与使用教程
Aug 10 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
django 类视图的使用方法详解
Jul 24 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
Python接口自动化判断元素原理解析
Feb 24 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
PyCharm中如何直接使用Anaconda已安装的库
May 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
实用函数5
2007/11/08 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
js/jQuery对象互转(快速操作dom元素)
2013/02/04 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
design vue 表格开启列排序的操作
2020/10/28 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
Python修改MP3文件的方法
2015/06/15 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
python实现定时发送qq消息
2019/01/18 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
python实现简单井字棋小游戏
2020/03/05 Python
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
介绍一下mysql的日期和时间函数
2013/03/28 面试题
酒店总经理工作职责
2013/12/13 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB