详解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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
Python实现购物程序思路及代码
Jul 24 Python
python中的随机函数小结
Jan 27 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
python制作填词游戏步骤详解
May 05 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
python异常处理try except过程解析
Feb 03 Python
python实现udp传输图片功能
Mar 20 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
python的netCDF4批量处理NC格式文件的操作方法
Mar 21 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
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
javascript跨域刷新实现代码
2011/01/01 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
浅析tr的隐藏和显示问题
2014/03/05 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
js数组去重的hash方法
2016/12/22 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
详解JavaScript的变量
2019/04/04 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
python 格式化输出百分号的方法
2019/01/20 Python
python3实现表白神器
2019/04/09 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
原料仓管员岗位职责
2014/04/12 职场文书
伦敦奥运会口号
2014/06/13 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技
java版 联机五子棋游戏
2022/05/04 Java/Android