递归调用流程分析|学习笔记

简介: 快速学习递归调用流程分析

开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map递归调用流程分析】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/625/detail/9598


递归调用流程分析

内容简介:

一、递归调用的基本简介

二、递归调用快速入门举例分析

三、函数递归需要遵守的重要原则

一、基本介绍

一个函数在函数体内又调用了本身,我们称为递归调用

二、递归调用快速入门举例分析

当调用 test(4)下面两段代码分别输出什么?并分析原因

第一段:

func test(n int) {

if n > 2 {

n--

test(n)

}

fmt.PrintIn("n=",n)

}

func main( ){

//看一段代码

test(4) // ?通过分析来观察递归调用的特点

}

首先代码从func main( ) { 开始执行

调用test(4)函数并在栈区为主函数开辟了一个空间

程序跳入第一行代码

接着执行第二行的判断语句判断n是否大于4

进入第三行代码执行后值变为3

进入第四行语句命令变为 test(3)并在栈里开辟一个新的独立空间

以此类推执行新栈得到 n=[3]

执行第二行代码判断 n=3大于2

执行 n--得到 n=2并再次调用 test(2)

再一次开辟一个新栈

依次执行每一行代码判断出 n=2不大于2

此时终端输出 n=2

最后一个栈执行完毕返回前一个栈且最后一个栈自动消失

代码分析图

image.png

依次返回前一个栈终端依次输出n=2、n=3

终端输出为

n=2

n=2

n=3

段:

func test2(n int) {

if n > 2 {

n--

test2(n)

} else {

fmt.PrintIn("n=",n)

}

}

func main( )

//看一段代码

test2(4) // ?通过分析来观察递归调用的特点

}

首先代码从func main( ) { 开始执行

调用test2(4)函数并在栈区为主函数开辟了一个空间

程序跳入第一行代码

接着执行第二行的判断语句判断n是否大于2

进入第三行代码执行后值变为3

进入第四行语句命令变为test(3)并在栈里开辟一个新的独立空间

以此类推执行新栈得到n=[3]

执行第二行代码判断n=3大于2

执行n--得到n=2并再次调用test(2)

再一次开辟一个新栈

依次执行每一行代码判断出n=2不大于2

此时执行else语句

终端输出n=2

最后一个栈执行完毕返回前一个栈且最后一个栈自动消失

前一个else并不执行

最终的终端输出仅为

n=2

代码分析图

image.png

两段代码的区别在于第二段代码存在else语句并且只执行代码分析图中第一个else,所以最终只输出n=2


三、函数递归需要遵守的重要原则

1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)

2)函数的局部变量是独立的,不会相互影响(例如示例代码中如果没有n--,程序就会不断无限循环调用同一个函数)

3)递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:)

4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。

相关文章
|
Linux API Android开发
Rockchip系列之客制化GPIO接口Hardware部分(3)
Rockchip系列之客制化GPIO接口Hardware部分(3)
254 0
算法:图解递归算法的应用场景和使用途径
算法:图解递归算法的应用场景和使用途径
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
576 0
|
存储 算法 Linux
DNF和Yum
DNF和Yum
765 3
|
JavaScript 数据安全/隐私保护
node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)
node.js 命令行的命令注册和配置工具(最新版) commander.js 实用教程(含自研脚手架的创建流程)
415 0
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1202 13
|
监控 Python
系统中出现僵尸进程排查过程
记一次僵尸进程过多的排查过程
843 0
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
1397 6
MQTT 发布、订阅模式介绍
|
运维 网络协议 Linux
Linux(28) Linux双网卡配置为连接到Linux主机的PC提供外网访问
Linux(28) Linux双网卡配置为连接到Linux主机的PC提供外网访问
873 1
|
机器学习/深度学习 算法 安全
第3讲笔记:详解隐私计算框架及技术要点
隐语架构是一个分层设计,支持不同技术路线,具有高内聚、低耦合特性,允许各层次的技术人员发挥所长。它包括产品层、算法层和计算层。产品层有SecretPad和SecretNote,提供轻量化安装和全栈产品,支持MPC、TEE等。算法层涉及PSI、PIR协议和SCQL,用于安全数据分析,屏蔽底层复杂性。计算层包含RayFed分布式调度框架和SPU密态计算核心,提供高性能密态计算能力和机器学习算法支持。
549 1