什么是递归函数
递归函数指的是在函数内部调用函数自身的函数
构成递归函数的条件
-
一个问题可以被拆分成多个子问题
-
拆分前的原问题与拆分后的子问题除了数据规模不同,但处理问题的思路是一样的
-
不能无限制的调用本身,子问题需要有退出递归状态的条件--->如果没有会造成内存溢出
斐波那契数列
示例代码:
package main
import "fmt"
func main() {
result := 0
//循环传递n
for i := 0; i <= 10; i++ {
result = fibonacci(i)
fmt.Printf("fibonacci(%d) is %d\n", i, result)
}
}
func fibonacci(n int) (res int) {
if n < 2 {
res = 1
}else {
res = fibonacci(n-1) + fibonacci(n-2)
}
return
/*
这个return只是结束条件
*/
}
数字阶乘
正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且 0 的阶乘为 1
n!=1×2×3×…×n
,也等价于递归方式:0!=1,n!=(n-1)!×n
示例代码:
package main
import "fmt"
/*
阶乘的函数,传入一个无符号的整数形参,返回的也是一个无符号的整数
*/
func factorial(n uint64) (result uint64) {
if n > 0 {
result = n*factorial(n-1)
return result
}
return 1
}
func main() {
fmt.Println(factorial(3))
}
多个函数组成的递归函数
本质:
A函数调用C函数,C函数调用B函数,B函数调用A函数
示例代码:
package main
import "fmt"
func main() {
fmt.Printf("%d is A: is %t\n", 16, A(16))
fmt.Printf("%d is B: is %t\n", 17, B(17))
fmt.Printf("%d is C: is %t\n", 18, B(18))
}
func A(n int) bool {
if n == 0 {
return true
}
return B(C(n)-1)
}
func B(n int) bool {
if n == 0 {
return false
}
return A(C(n)-1)
}
func C(n int) int {
if n < 0 {
return -n
}
return n
}
章节小结:
递归函数最重要的:
-
问题拆解成小问题,其解决思路是一样的
-
递归必须有结束条件
递归可以实现的使用循环也可以实现!!!