递归函数: 自己调用自己的函数

 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会终止当前函数
回到上一层函数的调用处 """

递归&栈帧空间的更多相关文章

  1. C语言函数调用及栈帧结构

    source:http://blog.csdn.net/qq_29403077/article/details/53205010 一.地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念, ...

  2. x86-64栈帧中的“红色区域” red zone of stack frame on x86-64

    前几天看System V AMD64 ABI标准的时候发现栈帧的顶部后面有一块"red zone",在学cs:app3e/深入理解操作系统的时候并没有遇到这个,总结一下. 引用标准 ...

  3. X86-64寄存器和栈帧--牛掰降解汇编函数寄存器相关操作

    X86-64寄存器和栈帧 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64:正是由于能向后兼容,AM ...

  4. X86-64寄存器和栈帧

    简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...

  5. 深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构

    运行时栈帧结构 栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素.每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程. 每一个栈帧在编 ...

  6. Java虚拟机之栈帧

    写在前面的话:Java虚拟机是一门学问,是众多Java大神们的杰作,由于我个人水平有限,精力有限,不能保证所有的东西都是正确的,这里内容都是经过深思熟虑的,部分引用原著的内容,讲的已经很好了,不在累述 ...

  7. JAVA栈帧

    简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据 ...

  8. IDA Pro 权威指南学习笔记(十) - 栈帧

    栈帧(stack frame)是在程序的运行时栈中分配的内存块,用于特定的函数调用 如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存 1.传给函数的参数的值需要存储到函数能够找到它们的位 ...

  9. CSAPP阅读笔记-栈帧-来自第三章3.7的笔记-P164-P176

    1.基本结构: 如上图所示,是通用的栈帧结构.大致分两块,调用者函数P和被调用者函数Q. 对P来说,要做的工作是把传递参数中多于6个的部分压栈,随后把Q返回时要执行的下一条指令的地址压栈. 对Q来说, ...

随机推荐

  1. Centos7部署ntp服务器同步时间以及直接将本地时间同步为北京时间

    一.查看配置 查看时区列表: timedatectl list-timezones|grep Asia 查看当前时间: date 查看当前设置: [root@localhost ~]# timedat ...

  2. microcks 微服务mocks 工具&&运行时

    microcks 是一个方便的微服务mock 工具,我们可以用来mock request.response,同时获取api 的服务契约,microcks 支持的部署模式也比较多,docker-comp ...

  3. idea 中maven编译速度过慢的问题的解决

    解决方案一 在创建Maven项目时加上 archetypeCatalog=internal 参数,如下: 解决方案二 在maven的VM Options加上-DarchetypeCatalog=int ...

  4. openstack 开启 spice远程连接

    openstack 默认开的远程控制是novnc 这里是用kolla初建的openstack nova_console vi /etc/kolla/globals.yml ... # Valid op ...

  5. linux centos6 yum 安装lamp

    centos 6.5 1.yum安装和源代码编译在使用的时候没啥区别,但是安装的过程就大相径庭了,yum只需要3个命令就可以完成,源代码需要13个包,还得加压编译,步骤很麻烦,而且当做有时候会出错,源 ...

  6. 七、springboot(四)配置redis

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  7. InvokeRequired和Invoke(转)

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...

  8. java-文件和I/O

    理解IO:http://www.importnew.com/23708.html 一.读写文件: FileInputStream 该流用于从文件读取数据,它的对象可以用关键字 new 来创建. 有多种 ...

  9. 转 Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

    今早刚上班.客户打电话过来说系统访问不了,输入用户名.用户号不能加载出来!听到这个问题,第一时间想到的是不是服务器重新启动了,Oracle数据库的相关服务没有启动的原因.查看服务的时候,发现相关的服务 ...

  10. 2017.11.13 flex 布局相关问题

    一.今日任务:城市体验平台小程序的开发(由于数据还未完善,今天主要是 UI 布局的开发) 二.所遇问题 1. flex 布局问题: html: <view class="flex-sp ...