函数的递归调用
- 基本介绍
- 一个函数在函数体内又调用了本身,我们称为递归调用
- 案例演示1
func test(n int) { if n > 2 { n-- test(n) } fmt.Println("n=", n) } func main() { test(4) }
- 分析
- 输出:
2 2 3
- 案例演示2
func test2(n int) { if n > 2 { n-- //递归必须向退出递归条件逼进,否则就是无限循环调用 test2(n) } else { fmt.Println("n=", n) } } func main() { test(4) }
- 分析
- 输出:
2
递归调用的总结
- 函数递归需要遵守的重要原则:
- 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
- 函数的局部变量是独立的,不会相互影响
- 递归必须向退出递归的条件逼近,否则就是无限递归
- 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁
递归案例
- 斐波那契数
- 请使用递归的方式,求出斐波那契数 1,1,2,3,5,8,13...
- 给你一个整数 n,求出它的斐波那契数是多少?
/* 请使用递归的方式,求出斐波那契数1,1,2,3,5,8,13... 给你一个整数n,求出它的斐波那契数是多少? */ 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 }
- 求函数值
- 已知 f(1)=3; f(n) = 2*f(n-1)+1;
- 请使用递归的思想编程,求出 f(n)的值?
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)) }
- 猴子吃桃子问题
- 有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第十天时,想再吃时(还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
//n 范围是 1 -- 10 之间 func peach(n int) int { if n > 10 || n < 1 { fmt.Println("输入的天数不对") return 0 //返回0表示没有得到正确数量 } if n == 10 { return 1 } else { return (peach(n + 1) + 1) * 2 } } func main() { fmt.Println("第1天桃子数量是=", peach(1)) //1534 }