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!!!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号