递归&栈帧空间
递归函数: 自己调用自己的函数
def digui(n):
print(n)
if n > 0:
digui(n-1)
print(n) digui(5)
执行结果:
5
4
3
2
1
0
0
1
2
3
4
5
执行过程:
""" 代码从上到下执行:
digui(5)
print 5
digui(4)
print 4
digui(3)
print 3
digui(2)
print 2
digui(1)
print 1
digui(0)
print 0
n !> 0
print 0 最内层的函数已经结束
开始向外面跳转 print 1
print 2
print 3
print4
prin 5
"""
"""
去的过程:
n = 5 print 5 n > 0 digui(5-1)
n = 4 print 4 n > 0 digui(4-1)
n = 3 print 3 n > 0 digui(3-1)
n = 2 print 2 n > 0 digui(2-1)
n = 1 print 1 n > 0 digui(1-1)
n = 0 print 0 n !=0 print 0 digui (0)调用结束
开始返回 回的过程:
n = 1 print 1 digui(1) 结束
n = 2 print 2 digui(2) 结束
n = 3 print 3 digui(3) 结束
n = 4 print 4 digui(4) 结束
n = 5 print 5 digui(5) 结束
整个函数执行完毕
"""
阶乘的执行
def jiecheng(n):
if n <= 1:
return 1
return jiecheng(n-1) * n print(jiecheng(5)) """
先计算return后面的表达式, 计算完毕后再返回 去的过程:
n = 5 jiechneg(5-1)*5
n = 4 jiecheng(4-1)*4
n = 3 jiecheng(3-1)*3
n = 2 jiecheng(2-1)*2
n = 1 if return 1 # 此时最内层代码执行完毕, return返回1 # 开始执行返回过程
n = 2 jiecheng(2-1)*2 1*2
n = 3 jiecheng(3-1)*3 1*2*3
n = 4 jiecheng(4-1)*4 1*2*3*4
n = 5 jiecheng(5-1)*5 1*2*3*4*5
栈帧空间:
"""
栈帧空间就是运行函数的,
调用函数就是开辟一个新的栈帧空间,
调用结束后会自动释放栈帧空间
""" """
去的过程:
没调用一个函数就开辟一块新的栈帧空间,
每结束一个变量, 就释放一个栈帧空间
递归本质上就是开辟和释放栈帧空间的过程 回的过程: 需要触底反弹
1.当前这层栈帧空间的代码全部执行完毕,
会自动回到上一层函数的调用处 2.当前函数遇到return会终止当前函数
回到上一层函数的调用处 """
递归&栈帧空间的更多相关文章
- C语言函数调用及栈帧结构
source:http://blog.csdn.net/qq_29403077/article/details/53205010 一.地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念, ...
- x86-64栈帧中的“红色区域” red zone of stack frame on x86-64
前几天看System V AMD64 ABI标准的时候发现栈帧的顶部后面有一块"red zone",在学cs:app3e/深入理解操作系统的时候并没有遇到这个,总结一下. 引用标准 ...
- X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作
X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64:正是由于能向后兼容,AM ...
- X86-64寄存器和栈帧
简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...
- 深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构
运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编 ...
- Java虚拟机之栈帧
写在前面的话:Java虚拟机是一门学问,是众多Java大神们的杰作,由于我个人水平有限,精力有限,不能保证所有的东西都是正确的,这里内容都是经过深思熟虑的,部分引用原著的内容,讲的已经很好了,不在累述 ...
- JAVA栈帧
简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据 ...
- IDA Pro 权威指南学习笔记(十) - 栈帧
栈帧(stack frame)是在程序的运行时栈中分配的内存块,用于特定的函数调用 如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存 1.传给函数的参数的值需要存储到函数能够找到它们的位 ...
- CSAPP阅读笔记-栈帧-来自第三章3.7的笔记-P164-P176
1.基本结构: 如上图所示,是通用的栈帧结构.大致分两块,调用者函数P和被调用者函数Q. 对P来说,要做的工作是把传递参数中多于6个的部分压栈,随后把Q返回时要执行的下一条指令的地址压栈. 对Q来说, ...
随机推荐
- nakadi-ui nakadi event broker 的可视化UI工具
nakadi 是一款很不错的基于fafka 开发的event broker ,我们只需要使用http 请求就可以调用kafka 方便的发布订阅功能 环境准备 docker-compose 文件 ver ...
- C# to IL 18 Glossary(术语)
- 深入详解美团点评CAT跨语言服务监控(六)消息分析器与报表(一)
大众点评CAT微服务监控架构对于消息的具体处理,是由消息分析器完成的,消息分析器会轮训读取PeriodTask中队列的消息来处理,一共有12类消息分析器,处理后的结果就是生成各类报表. 消息分析器的构 ...
- GUI相关学习资料
分类 1,基于OS,包括windows,linux,android,ios 2,基于语言,包括c++,java,c#,javacript 3,按照技术分类,这个其实和os,编程语言分不开,大概可以分为 ...
- 比较字典推导式/dict()/通过键来构造的字典的速率 笔记
# 下面结果执行一次不容易出差距,所以都执行100000次 import time dict1 = {'a':1, 'b':2, 'c':3, 'd':4} # 第一种:字典推导式 start_tim ...
- HanLP中人名识别分析详解
HanLP中人名识别分析详解 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: l ·名字识别的问题 #387 l ·机 ...
- Spring Cloud(Dalston.SR5)--Hystrix 断路器
Spring Cloud 对 Hystrix 进行了封装,使用 Hystrix 是通过 @HystrixCommand 注解来使用的,被 @HystrixCommand 注解标注的方法,会使用 Asp ...
- 【转】mysql给root开启远程访问权限,修改root密码
好记性不如烂笔头,偶然用一直忘.... mysql给root开启远程访问权限,修改root密码 1.MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1) ...
- 【转】SQL Server日志文件过大 大日志文件清理方法 不分离数据库
https://blog.csdn.net/slimboy123/article/details/54575592 还未测试 USE[master] GO ALTER DATABASE 要清理的数据库 ...
- Windows Azure Virtual Machine (36) 扩展Azure ARM VM的磁盘大小
<Windows Azure Platform 系列文章目录> 在默认情况下,Azure ARM VM的操作系统磁盘(OS Disk),容量为: (1)Windows VM OS Disk ...