函数递归需要遵守的重要原则:
1)每执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
2)函数的局部变量是独立的,不会相互影响
3)递归必须向退出递归的条件逼近,否则就是无限递归
4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁
例子一:
package main
import (
"fmt"
)
func test(n int) {
if n > 2 {
n--
test(n)
}
fmt.Println("n=", n)
}
func main() {
test(4)
}
//输出结果:
n = 2
n = 2
n = 3
例子二:
package main
import (
"fmt"
)
func test(n int) {
if n > 2 {
n--
test(n)
} else {
fmt.Println("n=", n)
}
}
func main() {
test(4)
}
//输出结果:
n = 2
练习1:
请使用递归的方式,求出斐波那契数1,1,2,3,5,8,13…
// 斐波那契数
// 1,1,2,3,5,8,13.....
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) //fbn(3)= 2
fmt.Println("fbn(4)=", fbn(4)) fbn(4)= 3
fmt.Println("fbn(5)=", fbn(5)) fbn(5)= 5
}
练习2:
求函数值
已知 f(1)=3; f(n)=2*f(n-1)+1;
请使用递归思想编程,求出f(n)的值?
// 已知 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() {
//调用f(n)函数
fmt.Println("f(2)=", f(2)) //f(2)= 7
}