一、递归调用简介
1.1 什么是递归调用
一个函数在函数体内又调用了本身,我们称为递归调用
1.2 递归小案例
package main
import "fmt"
func mless(n int) { if n > 2 { n-- mless(n) } fmt.Println("n = ", n)}
func main() {
// 使用 mless函数 // 传入5 -- > 满足n>2 ---> n--等于4,再次调用mless // 第二次调用 传入4 ---> 满足 n>2 --> n--等于3 ,再次调用mless // 第三次调用 传入3 ---> 满足 n>3 --> n--等于2 ,再次调用mless // 第四次调用 传入2 ---> 不满足 n>2 --> n--等于1 ,执行fmt打印 输出2----退出当前栈 // 结束第四次调用,返回到第三次,退出第三次中的if 语句,执行 fmt 打印 n =2 // 结束第三次调用,返回到第二次,退出第二次中的if,执行fmt 打印 n=3 // 结束第二次调用,返回第一次传入的5,退出第一次的if,执行fmt打印n=4 // 最终输出为 // n=2 n=2 n=3 n=4 mless(5)}
复制代码
1.3 函数递归原则
执行一个函数时,就创建一个 新的受保护的独立空间(新函数栈)
函数的局部变量是独立的,不会相互影响
递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:)
当一个函数执行完毕,或者遇到 return, 就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁
二、函数递归案例
2.1 斐波那契数列
请使用递归的方式,求出斐波那契数 1,1,2,3,5,8,3....,给你一个整数 n,求出它的值是多少?
package main
import "fmt"
func fib(num int) int { if num == 1 || num == 2 { return num } else { return fib(num-1) + fib(num-2) }}func main() { result := fib(5) fmt.Println(result)}
复制代码
2.2 求函数值
已知 f(1)=3; f(n)= 2*f(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() { // f(1) 测试 fmt.Println("f(1)= ", f(1)) fmt.Println("f(5)= ", f(5))
}
复制代码
2.3 猴子吃桃问题
题 3:猴子吃桃子问题
有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第十天时,想再吃时(还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
解析
第十天只有一个桃
第九天 = (第十天 +1 ) * 2
第 n 天桃子 peach(n) = (peach(n+1)+1)*2
package main
import "fmt"
func peach(d int) int { // d范围应该在 1-10 if d > 10 || d < 1 { fmt.Println("天数错误.....") return 0 } if d == 10 { return 1 } else { return (peach(d+1) + 1) * 2 }}func main() {
// 第一天桃子 fmt.Println("第一天的桃子数量: ", peach(1))}
复制代码
评论