1.golang递归
函数内部调用函数自身的函数称为递归函数。
使用递归函数最重要的三点:
1.递归就是自己调用自己
2.必须先定义函数的退出条件,没有退出条件,递归将成为死循环
3.go语言递归函数很可能会产生一大堆的goroutine,也很可能会出现桟空间内存溢出问题。
案例
阶乘
go
package main
import (
"fmt"
)
func f1() {
//for 方式
var s int = 1
//5!=5x4x3x2x1
for i := 1; i <= 5; i++ {
s *= i
}
fmt.Printf("s: %v\n", s)
}
func main() {
f1()
}
package main
import (
"fmt"
)
func f1() {
//for 方式
var s int = 1
//5!=5x4x3x2x1
for i := 1; i <= 5; i++ {
s *= i
}
fmt.Printf("s: %v\n", s)
}
func main() {
f1()
}
go
//递归方式
func f2(a int) int {
if a == 1 {
//1.退出条件
return 1
} else {
//2.自己调用自己
return a * f2(a-1)
}
}
func main() {
i := f2(5)
fmt.Printf("i: %v\n", i)
}
//递归方式
func f2(a int) int {
if a == 1 {
//1.退出条件
return 1
} else {
//2.自己调用自己
return a * f2(a-1)
}
}
func main() {
i := f2(5)
fmt.Printf("i: %v\n", i)
}
斐波那契数列
公式:f(n)=f(n-1)+f(n-2)且f(2)=f(1)=1
go
//递归方式
func f2(a int) int {
if a == 1 {
//退出条件
return 1
} else {
//自己调用自己
return a * f2(a-1)
}
}
func f(n int) int {
if n == 1 || n == 2 {
return 1
}
return f(n-1) + f(n-2)
}
func main() {
i := f(5)
fmt.Printf("i: %v\n", i)
}
//递归方式
func f2(a int) int {
if a == 1 {
//退出条件
return 1
} else {
//自己调用自己
return a * f2(a-1)
}
}
func f(n int) int {
if n == 1 || n == 2 {
return 1
}
return f(n-1) + f(n-2)
}
func main() {
i := f(5)
fmt.Printf("i: %v\n", i)
}