详解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中运行并行任务技巧
Feb 26 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
May 11 Python
简单谈谈python中的语句和语法
Aug 10 Python
Face++ API实现手势识别系统设计
Nov 21 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
python3使用matplotlib绘制条形图
Mar 25 Python
python生成随机红包的实例写法
Sep 02 Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 Python
django如何自定义manage.py管理命令
Apr 27 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
自动分页的不完整解决方案
2007/01/12 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
详解vue渲染函数render的使用
2017/12/12 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
python快速排序代码实例
2013/11/21 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python多线程同步之文件读写控制
2021/02/25 Python
python实现翻译word表格小程序
2020/02/27 Python
Django values()和value_list()的使用
2020/03/31 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
cf收人广告词大全
2014/03/14 职场文书
企业负责人任命书
2014/06/05 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python