zoukankan      html  css  js  c++  java
  • 9.7Go之函数之递归函数

    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
    }

    章节小结:

    递归函数最重要的:

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

    • 递归必须有结束条件

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

  • 相关阅读:
    文件读写和进度条
    复选框选择变化(可以演化成简单的字符串拼接)
    读取文本方式的简单登录
    计算字符出现次数
    判断系统版本号
    DataTable合并
    获取单元格值的数据类型
    struts2 日期标签
    jsp获取枚举的值
    java web项目修改项目名称
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15239770.html
Copyright © 2011-2022 走看看