likes
comments
collection
share

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥

作者站长头像
站长
· 阅读数 101

一、函数-递归调用:

一、基本介绍:

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

二、递归调用快速入门:

package main

import "fmt"

func test(n int) {
	if n > 2 {
		n--
		test(n)
	}
	fmt.Println("n = ", n)
}
func main() {

	// 看一段代码
	test(4)
}

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥

上面代码的分析图:

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥


package main

import "fmt"

func test(n int) {
	if n > 2 {
		n--
		test(n)
	}
	fmt.Println("n = ", n)
}

func test2(n int) {
	if n > 2 {
		n--
		test2(n)
	} else {
		fmt.Println("n = ", n)
	}

}
func main() {

	// 看一段代码
	test2(4)
}

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥

上面代码的分析图:

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥


三、递归调用的总结:’

  1. 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
  2. 函数的局部变量是独立的,不会相互影响。
  3. 递归必须向退出递归的条件逼近,否则就是无限递归,(死归了)
    1. 也就是说,递归必须要有出口,不然就是死循环!!(必须要有终止条件)
  1. 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用,就将返回结果给谁。同时当函数执行完毕或者返回时,该函数本身也会被销毁。(栈空间也就被释放了)

二、函数-递归调用练习题:

题目一:斐波那契数列

  1. 请使用递归的方式,求出斐波那契数 1,1, 2, 3, 5, 8, 13 给你一个整数n,求出它的值是多少?

\

思路:

  1. 当 n == 1 || n ==2,返回 1
  2. 当 n >=2 ,返回前面两个数的和 f(n-1) + f(n-2)
package main

import "fmt"

func fbn(n int) int {

	if n == 1 || n == 2 {
		return 1
	} else {
		return fbn(n-1) + fbn(n-2)
	}
}
func main() {
	res := fbn(3)
	//测试
	fmt.Println("res=", res)
	fmt.Println("res=", fbn(4)) // 3
	fmt.Println("res=", fbn(5)) // 5
	fmt.Println("res=", fbn(6)) // 8
}

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥

题目二:求函数值

  1. 已知 f(1)=3;f(n)=2*(n-1)+1; 请你使用递归的思想编程,求出f(n)的值

\

思路:

package main

import "fmt"

func f(n int) int {
	if n == 1 {
		return 3
	} else {
		return 2*f(n-1) + 1
	}
}
func main() {
	//测试
	fmt.Println("f(1)=", f(1))
	fmt.Println("f(5)=", f(5))
}

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥

题目三:猴子吃桃子的问题

  1. 有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第十天时候,想再吃(还没吃),发现只有一个桃子了。问题:请问最初有多少个桃子?

思路:

  1. 第10天只有一个桃子
  2. 第9天有几个桃子? = (第十天桃子数量 + 1) * 2
  3. 规律:第 n 天的桃子数据 peach(n) = (peach(n+1)+1)*2
package main

import "fmt"

func peach(n int) int {
	if n > 10 || n < 1 {
		fmt.Println("输入的天数不对")
	}
	if n == 10 {
		return 1
	} else {
		return (peach(n+1) + 1) * 2
	}
}
func main() {
	//测试
	fmt.Println("第一天桃子数量是 = ", peach(1))
}

【第十七篇】一文搞懂_GO语言函数递归调用流程分析🔥🔥

总结:

第一要素:明确你这个函数想要干什么?

第二要素:寻找递归结束条件

第三要素:找出函数的等价关系式


转载自:https://juejin.cn/post/7151418152386035749
评论
请登录