详解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实现定制交互式命令行的方法
Jul 03 Python
python实现SOM算法
Feb 23 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
python创建学生管理系统
Nov 22 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python使用Chrome插件实现爬虫过程图解
Jun 09 Python
Python中如何添加自定义模块
Jun 09 Python
Python可以用来做什么
Nov 23 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
thinkphp实现数组分页示例
2014/04/13 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
Python 抓取动态网页内容方案详解
2014/12/25 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
Random 在 Python 中的使用方法
2018/08/09 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
详解python logging日志传输
2020/07/01 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
什么是反射
2012/03/17 面试题
工业设计专业个人求职信范文
2013/12/28 职场文书
社区春季防火方案
2014/06/02 职场文书
孔庙导游词
2015/02/04 职场文书
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS
python manim实现排序算法动画示例
2022/08/14 Python