提升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随机读取文件实现实例
May 25 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
python3 pygame实现接小球游戏
May 14 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
Python3搭建http服务器的实现代码
Feb 11 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Python环境搭建过程从安装到Hello World
Feb 05 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
PHP时间和日期函数详解
2015/05/08 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
Python作用域与名字空间原理详解
2020/03/21 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
淘宝客服自我总结鉴定
2014/01/25 职场文书
辞职信怎么写
2015/02/27 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
MySQL索引是啥?不懂就问
2021/07/21 MySQL