python中递归函数写法_详解python中递归函数
函数执行流程
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 ")
函数执行过程:
全局帧中生成foo1、foo2、foo3、main函数对象
main函数调用
main中查找内建函数print压栈,将常量字符串压栈,调用函数,弹出栈顶,返回值。
main中全局查找foo1压栈,将常量100、101压栈,调用函数foo1,创建栈帧。print函数压栈,字符串和变量b、b1压栈,调用函数,弹出栈顶,返回值。
main中全局查找foo2函数压栈,将常量200压栈,调用foo2,创建栈帧。foo3函数压栈,变量c引用压栈,调用foo3函数,创建栈帧,foo3中内建函数中查找print压栈,将字符常量和变量d压栈。foo3完成print函数调用后返回。foo2恢复调用,执行print后,返回值,main中foo2调用结束后弹出栈顶,main继续执行print函数调用,弹出栈顶,main函数返回
函数中压栈,执行流程。
递归Recursion
函数直接或者间接调用自身就是递归
递归需要有边界条件、递归前进段,递归返回段
递归一定需要有边界条件
当边界条件不满足的时候,递进前进
当边界条件满足的时候,递归返回
递归要求
递归一定要有退出条件,递归调用一定执行到这个退出条件。没有退出条件的递归调用,就是无限调用
递归调用的深度不宜过深
python对递归调用的深度做了限制,以保护解释器,cpython中递归深度为1000,ipython中递归深度为3000
超过递归深度限制,抛出RecursionError:maxinum recursion depth exceeded 超出最大深度
sys.getrecursionlimit()是显示最大限制
对于基于前面或者换位置的时候使用封装和解构更有效
斐波那契数列实现(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()
间接递归,是通过别的函数调用了函数自身,但是如果构成了循环递归调用是非常危险的,但是往往这种情况在代码复杂的情况下,还是有可能发生这种调用的,要用代码的规范来避免这种递归调用的发生
递归总结
递归是一种很自然的表达,符合逻辑思维
递归相对运行效率低,每一次调用函数都要开辟新的栈帧
递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就溢出了
如果是有限次数的递归,可以使用递归调用,或者使用循环代替,循环代码稍微复杂一些,但是只要不是死循环,过次迭代直至算出结果
绝大多数递归,都可以使用循环实现
即使递归代码很简洁,能不用尽量不使用递归
以上所述是小编给大家介绍的python递归函数详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对聚米学院网站的支持!
python中递归函数写法_详解python中递归函数相关推荐
- python停止线程池_详解python中Threadpool线程池任务终止示例代码
需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它:偶数则等待对应时长并完成所有任务:0则是错误,但不需要终止任务,可以自定义一些处理. 关键点 定义func函数处理需求 callbac ...
- python中index函数_详解python中的index函数用法
1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...
- python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍
squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...
- python中延时函数_详解python中实现延时回调普通函数
这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...
- python中byte类型_详解python string类型 bytes类型 bytearray类型
搜索热词 一.python3对文本和二进制数据做了区分.文本是Unicode编码,str类型,用于显示.二进制类型是bytes类型,用于存储和传输.bytes是byte的序列,而str是unicode ...
- python中setattr用法_详解Python的hasattr() getattr() setattr() 函数使用方法
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...
- python变量定义大全_详解python变量与数据类型
这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...
- python模块搜索原则_详解python模块路径查找规则及定义
在python中创建一个模块非常简单,只需要在当前目录下创建一个 .py文件即可,系统自动将其解析成模块,文件名就是模块名.很多我们源码时代的同学都认为在查找模块时优先使用当前目录下的自定义模块.其实 ...
- python提取hbase数据_详解python操作hbase数据的方法介绍
配置 thrift python使用的包 thrift 个人使用的python 编译器是pycharm community edition. 在工程中设置中,找到project interpreter ...
最新文章
- linux多用户怎么表示,Linux如何建立多用户
- JQUERY插件学习之jQuery UI
- vscode打开自动提示_Python编程的最好搭档:VSCode 详细指南
- oracle 替换全部空格
- c++多边形扫描线填充算法_python 小乌龟turtle画随机正多边形
- XML 与动态添加控件
- 腾讯第一大股东 Prosus 18亿美元收购 StackOverFlow
- 黄聪:is_file和file_exists效率比较
- 读吴恩达算-EM算法笔记
- nes 红白机模拟器 第4篇 linux 手柄驱动支持
- 兄弟们,以后不能愉快的抽烟
- CSC公派访问学者申请条件是什么?
- vue3实现tags
- 踱步狼注释移除,状态机算法更新2019.10.16
- 安阳工学院计算机专业宿舍,安阳工学院宿舍条件,宿舍环境图片(10篇)
- js 日期格式转换为中文日期
- oppo a36参数配置
- js中字符串数字转换为数值类型
- 响应式织梦模板家具家居类网站
- python-nmap使用方法(python3)
热门文章
- mysql 整型默认值,MySQL表字段设立默认值
- idea集成svn 从svn下载项目流程
- learnopencv 之 Delaunay 显示动态绘制obama脸型特征 @ Jupyter
- C语言实现strcpy
- python sdklive2d_用Cubism 2制作自己的Live2D(尝试向)——android sdk样本的下载与Android studio编译!...
- 基于ssm和mysql的智能停车系统、javaweb实现bs结构的停车场智能车位出入管理
- iPhone续航崩溃 30分钟掉电50%!太惨了
- 求二叉树上结点的路径
- 程序员也应了解的Unity粒子系统
- TFT_eSPI 库使用中遇到的坑