9.7Go之函数之递归函数

什么是递归函数

递归函数指的是在函数内部调用函数自身的函数

构成递归函数的条件

  • 一个问题可以被拆分成多个子问题

  • 拆分前的原问题与拆分后的子问题除了数据规模不同,但处理问题的思路是一样的

  • 不能无限制的调用本身,子问题需要有退出递归状态的条件--->如果没有会造成内存溢出

斐波那契数列

示例代码:

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
}

章节小结:

递归函数最重要的:

  • 问题拆解成小问题,其解决思路是一样的

  • 递归必须有结束条件

递归可以实现的使用循环也可以实现!!!

It's a lonely road!!!