递归&栈帧空间
递归函数: 自己调用自己的函数
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来说, ...
随机推荐
- loging日志文件
此文件要放到django 项目中的setting文件夹,可以对文件进行一些配置和修改 # 定义一下log文件存放的位置 BASE_LOG_DIR = os.path.join(BASE_DIR, &q ...
- python结合redis模拟队列
实在无聊就写了个很小的python程序用来实现模拟redis队列的代码如下: redis_lpush.py #!/usr/bin/python3 import time import redis ...
- 关于margin padding
margin padding设置百分比是以父元素的宽度作参考. 定位的left,top等取百分比 则以参照定位元素的padding+width做参考 margin 四个同时设定 以margin-lef ...
- pdf.js 的使用
现在的浏览器基本都支持直接把 pdf 文件拖到浏览器就可以打开,不用下载pdf阅读插件,但是在写网页的时候遇到了 pdf 文件怎么办呢,有两种解决办法,一种是用 falsh 来向用户展示,优点就是支持 ...
- 单页面应用(SPA)重新部署后,正在浏览的页面如何更新缓存?
当单页面的系统在重新部署更新时,此时正在浏览网页,并且已经在网页内的用户,始终会使用老的js与css文件,一直在使用已经缓存了的静态资源. 所有的缓存问题焦点都在index.html上,只要index ...
- 会话状态Session
一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...
- hadoop发行版本之间的区别
Hadoop是一个能够对大量数据进行分布式处理的软件框架. Hadoop 以一种可靠.高效.可伸缩的方式进行数据处理.Hadoop的发行版除了有Apache hadoop外cloudera,horto ...
- chgrp命令详解
Linux chgrp命令 Linux chgrp命令用于变更文件或目录的所属群组. 在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理.您可以使用chgrp指令去变更文件与目录的所属 ...
- elasticsearch 基本操作
安装delete_by_query ,cd进/bin,执行./plugin install delete-by-query DELETE http://192.168.1.12:9200/dd ...
- 搭建Cordova + Ionic + WebStorm环境开发Web App应用
1. 下载并且安装Node.js(https://nodejs.org/en/) 2. 打开终端,安装cordova (如果安装失败或者卡住不动则重新安装) sudo npm install - ...