开发者学堂课程【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
最后一个栈执行完毕返回前一个栈且最后一个栈自动消失
代码分析图
依次返回前一个栈终端依次输出n=2、n=3
终端输出为
n=2
n=2
n=3
第二段:
func test
2(n int) {
if n > 2 {
n--
test
2(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
代码分析图
两段代码的区别在于第二段代码存在else语句并且只执行代码分析图中第一个else,所以最终只输出n=2
三、函数递归需要遵守的重要原则
1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
2)函数的局部变量是独立的,不会相互影响(例如示例代码中如果没有n--,程序就会不断无限循环调用同一个函数)
3)递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:)
4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。