详解python中递归函数


Posted in Python onApril 16, 2019

函数执行流程

def foo1(b,b1=3):
   print("foo1 called",b,b1)
 
 def foo2(c):
    foo3(c)
    print("foo2 called",c)
 def foo3(d):
   print("foo3 called",d)
 def main():
   print("main called")
   foo1(100,101)
   foo2(200)
   print("main ending ")

函数执行过程:

  1. 全局帧中生成foo1、foo2、foo3、main函数对象
  2. main函数调用
  3. main中查找内建函数print压栈,将常量字符串压栈,调用函数,弹出栈顶,返回值。
  4. main中全局查找foo1压栈,将常量100、101压栈,调用函数foo1,创建栈帧。print函数压栈,字符串和变量b、b1压栈,调用函数,弹出栈顶,返回值。
  5. main中全局查找foo2函数压栈,将常量200压栈,调用foo2,创建栈帧。foo3函数压栈,变量c引用压栈,调用foo3函数,创建栈帧,foo3中内建函数中查找print压栈,将字符常量和变量d压栈。foo3完成print函数调用后返回。foo2恢复调用,执行print后,返回值,main中foo2调用结束后弹出栈顶,main继续执行print函数调用,弹出栈顶,main函数返回

 函数中压栈,执行流程。

递归Recursion

  1. 函数直接或者间接调用自身就是递归
  2. 递归需要有边界条件、递归前进段,递归返回段
  3. 递归一定需要有边界条件
  4. 当边界条件不满足的时候,递进前进
  5. 当边界条件满足的时候,递归返回

 递归要求

  1. 递归一定要有退出条件,递归调用一定执行到这个退出条件。没有退出条件的递归调用,就是无限调用
  2. 递归调用的深度不宜过深
  3. python对递归调用的深度做了限制,以保护解释器,cpython中递归深度为1000,ipython中递归深度为3000
  4. 超过递归深度限制,抛出RecursionError:maxinum recursion depth exceeded 超出最大深度
  5. sys.getrecursionlimit()是显示最大限制
  6. 对于基于前面或者换位置的时候使用封装和解构更有效

斐波那契数列实现(f(1)=1,f(2)=1,f(3)=f(1)+f(2),f(4)=f(2)+f(3)……)

#斐波那契数列普通循环实现
a,b=0,1
for i in range(4):
  a,b=b,a+b
print(a)

#斐波那契数列函数递归实现
def foo(n): #大量的重复计算
   return 1 if n<3 else foo(n-1)+foo(n-2) 
 
#斐波那契数列函数循环实现
def fn(n,a=0,b=1):
  a,b=b,a+b
  if n==1:
    return a
  return fn(n-1,a,b)

递归的性能

循环稍微复杂一些,但是只要不是死循环,可以多次迭代直至算出结果
递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快会溢出

间接递归

def foo1():
  foo2()
def foo2():
  foo1()

间接递归,是通过别的函数调用了函数自身,但是如果构成了循环递归调用是非常危险的,但是往往这种情况在代码复杂的情况下,还是有可能发生这种调用的,要用代码的规范来避免这种递归调用的发生

递归总结

  1. 递归是一种很自然的表达,符合逻辑思维
  2. 递归相对运行效率低,每一次调用函数都要开辟新的栈帧
  3. 递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就溢出了
  4. 如果是有限次数的递归,可以使用递归调用,或者使用循环代替,循环代码稍微复杂一些,但是只要不是死循环,过次迭代直至算出结果
  5. 绝大多数递归,都可以使用循环实现
  6. 即使递归代码很简洁,能不用尽量不使用递归

以上所述是小编给大家介绍的python递归函数详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python常用正则表达式符号浅析
Aug 13 Python
Python自动登录126邮箱的方法
Jul 10 Python
python八大排序算法速度实例对比
Dec 06 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python实现点云投影到平面显示
Jan 18 Python
Python任务自动化工具tox使用教程
Mar 17 Python
QML用PathView实现轮播图
Jun 03 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 06 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 #Python
详解Python连接MySQL数据库的多种方式
Apr 16 #Python
详解Python学习之安装pandas
Apr 16 #Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 #Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 #Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 #Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 #Python
You might like
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php实现短信发送代码
2015/07/05 PHP
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
vue-cli之router基本使用方法详解
2017/10/17 Javascript
js实现登录与注册界面
2017/11/01 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
前端性能优化建议
2020/09/17 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
乔迁宴答谢词
2014/01/21 职场文书
批评与自我批评材料
2014/02/15 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
法定授权委托证明书
2015/06/18 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
图文详解Nginx版本平滑升级方案
2021/09/15 Servers