递归&栈帧空间

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

1 def digui(n):
2    print(n)
3    if n > 0:
4       digui(n-1)
5    print(n)
6
7 digui(5)

执行结果:

 1 5
 2 4
 3 3
 4 2
 5 1
 6 0
 7 0
 8 1
 9 2
10 3
11 4
12 5

执行过程:

 1 """
 2
 3 代码从上到下执行:
 4 digui(5)
 5 print 5
 6    digui(4)
 7    print 4
 8       digui(3)
 9       print 3
10          digui(2)
11          print 2
12             digui(1)
13             print 1
14                digui(0)
15                print 0
16                n !> 0
17                print 0
18
19                最内层的函数已经结束
20                开始向外面跳转
21
22             print 1
23          print 2
24       print 3
25    print4
26 prin 5
27 """
 1 """
 2 去的过程:
 3 n = 5  print 5    n > 0  digui(5-1)
 4 n = 4  print 4    n > 0  digui(4-1)
 5 n = 3  print 3       n > 0  digui(3-1)
 6 n = 2  print 2       n > 0  digui(2-1)
 7 n = 1  print 1       n > 0  digui(1-1)
 8 n = 0  print 0       n !=0  print 0
 9
10
11 digui (0)调用结束
12 开始返回
13
14
15
16 回的过程:
17 n = 1  print 1    digui(1)   结束
18 n = 2  print 2       digui(2)   结束
19 n = 3  print 3       digui(3)   结束
20 n = 4  print 4       digui(4)   结束
21 n = 5  print 5       digui(5)   结束
22 整个函数执行完毕
23 """

阶乘的执行

 1 def jiecheng(n):
 2    if n <= 1:
 3       return 1
 4    return jiecheng(n-1) * n
 5
 6
 7 print(jiecheng(5))
 8
 9 """
10 先计算return后面的表达式, 计算完毕后再返回
11
12 去的过程:
13 n = 5  jiechneg(5-1)*5
14 n = 4  jiecheng(4-1)*4
15 n = 3  jiecheng(3-1)*3
16 n = 2  jiecheng(2-1)*2
17 n = 1  if return 1
18
19 # 此时最内层代码执行完毕, return返回1
20
21
22 # 开始执行返回过程
23 n = 2  jiecheng(2-1)*2       1*2
24 n = 3  jiecheng(3-1)*3       1*2*3
25 n = 4  jiecheng(4-1)*4       1*2*3*4
26 n = 5  jiecheng(5-1)*5       1*2*3*4*5

栈帧空间:

 1 """
 2 栈帧空间就是运行函数的,
 3 调用函数就是开辟一个新的栈帧空间,
 4 调用结束后会自动释放栈帧空间
 5 """
 6
 7
 8
 9 """
10 去的过程:
11 没调用一个函数就开辟一块新的栈帧空间,
12 每结束一个变量, 就释放一个栈帧空间
13 递归本质上就是开辟和释放栈帧空间的过程
14
15
16 回的过程: 需要触底反弹
17 1.当前这层栈帧空间的代码全部执行完毕,
18 会自动回到上一层函数的调用处
19
20 2.当前函数遇到return会终止当前函数
21 回到上一层函数的调用处
22
23 """

原文地址:https://www.cnblogs.com/caihuajiaoshou/p/10611911.html

时间: 2024-10-26 15:16:47

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

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

source:http://blog.csdn.net/qq_29403077/article/details/53205010 一.地址空间与物理内存 (1)地址空间与物理内存是两个完全不同的概念,真正的代码及数据都存在物理内存中. 物理储存器是指实际存在的具体储存器芯片,CPU在操纵物理储存器的时候都把他们当做内存来对待,把他们看成由若干个储存单元组成的逻辑储存器,这个逻辑储存器就是我们所说的地址空间. 地址空间大小与逻辑储存器大小不一定相等. (2)进程的地址空间分布 进程的地址空间包括:

函数的调用过程(栈帧)

1.什么是栈帧? 栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构.C语言中,每个栈帧对应着一个未运行完的函数.从逻辑上讲,栈帧就是一个函数执行的环境:函数调用框架.函数参数.函数的局部变量.函数执行完后返回到哪里等等.栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址). 2.Add()函数的调用过程 我们以Add()函数为例深入的研究一

运行时栈帧结构

栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表.操作数栈.动态连接和方法返回地址等信息.每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程.每一个栈帧都包括了局部变量表.操作数栈.动态连接.方法返回地址和一些额外的附加信息.在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入

函数调用过程栈帧变化详解

http://www.cnblogs.com/fxplove/articles/2574451.html 数调用另一个词语表示叫作 过程.一个过程调用包括将数据和控制从代码的一部分传递到另一部分.另外,它还必须在进入时为过程的局部变量分配空间,并在推出时释放这些空间.而数据传递,局部变量的分配和释放通过操纵程序栈来实现.在了解本文章之前,您需要先对程序的进程空间有所了解,即对进程如何使用内存?如果你知道这些,下面的内容将是很easy的事情了.为了您的回顾还是将简单的分布图贴出来,便于您的回顾.

c函数调用过程原理及函数栈帧分析

转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707       今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比较清晰的思路把这一过程描述出来,关于c函数调用原理的理解是很重要的. 1.关于栈 首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸,那么就很明显了,栈有栈底和栈顶,那么栈顶的地址要比栈底低.对x86体系的CPU而言,其中 ---> 寄存器ebp(

函数栈帧

在函数栈帧中 一般包含以下几类重要信息 1 局部变量 :为函数局部变量开辟的内存空间 2 栈帧状态值:保存前   栈帧的顶部和底部 3 函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置 以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令. EIP:指令寄存器:其内存放着一个指针,该指针永远指向下一条等待执行的指令地址 可以说 控制了 EIP 寄存器的内容,就控制了进程 我们让EIP指向哪里,CPU就会去执行哪里的指令. EIP劫持原理.

栈帧 --- 程序运行中数据的更改问题

一.栈 栈作为一种特殊的数据结构而存在("后入先出"存储),是一种只能在一端进行插入和删除操作的特殊线性表. 大多数CPU上的程序实现使用栈来支持函数调用操作.栈用来传递函数参数.存储返回信息.临时保存寄存器原有值以用于回复以及存储局部数据. 栈有很多自己的特性,它具有记忆功能,对栈的插入与删除操作中,不需要改变栈底指针:而且栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.因此栈作用就是用来保持栈帧的活动记录(即函数调用).

C函数调用机制及栈帧指针

转载: http://bbs.csdn.net/topics/90317145 http://blog.chinaunix.net/uid-26817832-id-3347227.html 帧指针 和栈指针到底是什么,有什么联系吗 FP帧指针指向帧头 SP栈指针指向栈顶 大部分现代计算机系统使用栈来给进程传递参数并且存储局部变量.栈是一种在进程映象内存的高地址内的后进先出(LIFO)的缓冲区.当程序调用一个函数时 一个新的"栈帧"会被创建.这个栈帧包含着传递给函数的各种参数和一些动态的

虚拟机中的运行时栈帧

每个人都知道,各种各样的动画视频,都是由一帧一帧图片连续切换结果的结果而产生的,其实虚拟机的运行和动画也类似,每个在虚拟机中运行的程序也是由许多的帧的切换产生的结果,只是这些帧里面存放的是方法的局部变量,操作数栈,动态链接,方法返回地址和一些额外的附加信息组成,在虚拟机中包含这些信息的帧称为"栈帧",每个方法的执行,在虚拟机中都是对应的栈帧在虚拟机栈中的入栈到出栈的过程.其中比较重要的一点时,如果虚拟机中同时有多个线程在执行,那么各个线程的栈帧都是相互独立,互不侵犯的,所以这也实现了局