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

 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. JDBC事务的处理-----模拟银行转账业务

    定义: 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 概要: 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: ...

  2. [转]SQL UNION 和 UNION ALL 操作符

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  3. AIX系统日志

    1.系统错误日志 存放路径:/var/adm/ras/errlog 说明:该日志记录了系统所检测到的软硬件故障和错误,尤其对系统的硬件故障有很大的参考价值,是AIX提供的最有价值的日志之一, errl ...

  4. 30-seconds-of-css

    你可以再30秒或者更短的时间内读懂的有用的CSS代码片段的精选. github地址 不过代码不在github上面 官网地址 上面有详细的介绍和演示 下面是我读到的一些个人认为比较实用的片段 1. 等宽 ...

  5. spark机器学习

    多层感知器(MLP) from __future__ import print_function from pyspark.ml.classification import MultilayerPer ...

  6. SyntaxError: Non-ASCII character '\xe4' in file t.py on line 3, but no encoding declared

    问题 报错代码 #!/usr/bin/python s = "你好" print s 执行报错: File "t.py", line 3 SyntaxError ...

  7. Hanlp分词之CRF中文词法分析详解

    这是另一套基于CRF的词法分析系统,类似感知机词法分析器,提供了完善的训练与分析接口. CRF的效果比感知机稍好一些,然而训练速度较慢,也不支持在线学习. 默认模型训练自OpenCorpus/pku9 ...

  8. 基于Java+SparkStreaming整合kafka编程

    一.下载依赖jar包 具体可以参考:SparkStreaming整合kafka编程 二.创建Java工程 太简单,略. 三.实际例子 spark的安装包里面有好多例子,具体路径:spark-2.1.1 ...

  9. 亚马逊 AWS ip反向解析:Configurable Reverse DNS for Amazon EC2’s Elastic IP Addresses

    I’d like to call your attention to a new feature that we rolled out earlier this month. You can now ...

  10. SDI工程时钟路径分析

    SDI工程时钟路径分析 //------------- Receive Ports - RX Fabric Output Control Ports ------------- output rxou ...