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

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

开发者学堂课程【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,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。

相关文章
|
4月前
|
JSON 前端开发 Java
前后端数据交互-----表单数据获取不到,出错的原因,在编写接口时,没有考虑数据如何返回,解决问题的思路,找到自己出错的地方,围绕着出错的地方进行考虑(很重要),找对解决问题的视频,理清返回数据的思路
前后端数据交互-----表单数据获取不到,出错的原因,在编写接口时,没有考虑数据如何返回,解决问题的思路,找到自己出错的地方,围绕着出错的地方进行考虑(很重要),找对解决问题的视频,理清返回数据的思路
|
缓存 算法 Java
使用迭代优化递归程序
大家好,我是王有志。 今天我们将会分析上篇文章中递归算法存在的问题,并通过迭代去优化。
105 1
使用迭代优化递归程序
|
算法 Java API
逆向的流程和思路
逆向的流程和思路
|
算法
谈一谈|return None来看递归函数流程解析
谈一谈|return None来看递归函数流程解析
97 0
|
SQL Web App开发 设计模式
PHP代码审计系列(一) 基础:方法、思路、流程
PHP代码审计系列(一) 基础:方法、思路、流程
455 0
算法提炼--递归(2)
算法提炼--递归(2)
算法提炼--递归(4)
算法提炼--递归(4)
算法提炼--递归(1)
算法提炼--递归(1)
算法提炼--递归(3)
算法提炼--递归(3)