日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言遞歸函數(shù)

很對(duì)編程語(yǔ)言都支持遞歸函數(shù),Go語(yǔ)言也不例外,所謂遞歸函數(shù)指的是在函數(shù)內(nèi)部調(diào)用函數(shù)自身的函數(shù),從數(shù)學(xué)解題思路來(lái)說(shuō),遞歸就是把一個(gè)大問(wèn)題拆分成多個(gè)小問(wèn)題,再各個(gè)擊破,在實(shí)際開(kāi)發(fā)過(guò)程中,遞歸函數(shù)可以解決許多數(shù)學(xué)問(wèn)題,如計(jì)算給定數(shù)字階乘、產(chǎn)生斐波系列等。

成都創(chuàng)新互聯(lián)公司堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨嚒N覀儚牟缓鲇瞥踉L客戶,我們用心做好本職工作,不忘初心,方得始終。十年網(wǎng)站建設(shè)經(jīng)驗(yàn)成都創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營(yíng)銷服務(wù)商,為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、H5高端網(wǎng)站建設(shè)、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、微信小程序定制開(kāi)發(fā)服務(wù),給眾多知名企業(yè)提供過(guò)好品質(zhì)的建站服務(wù)。

構(gòu)成遞歸需要具備以下條件:

  • 一個(gè)問(wèn)題可以被拆分成多個(gè)子問(wèn)題;
  • 拆分前的原問(wèn)題與拆分后的子問(wèn)題除了數(shù)據(jù)規(guī)模不同,但處理問(wèn)題的思路是一樣的;
  • 不能無(wú)限制的調(diào)用本身,子問(wèn)題需要有退出遞歸狀態(tài)的條件。

注意:編寫(xiě)遞歸函數(shù)時(shí),一定要有終止條件,否則就會(huì)無(wú)限調(diào)用下去,直到內(nèi)存溢出。

下面通過(guò)幾個(gè)示例來(lái)演示一下遞歸函數(shù)的使用。

斐波那契數(shù)列

下面我們就以遞歸函數(shù)的經(jīng)典示例 —— 斐波那契數(shù)列為例,演示如何通過(guò)Go語(yǔ)言編寫(xiě)的遞歸函數(shù)來(lái)打印斐波那契數(shù)列。

數(shù)列的形式如下所示:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …

使用Go語(yǔ)言遞歸函數(shù)實(shí)現(xiàn)斐波那契數(shù)列的具體代碼如下所示:

package main
import "fmt"
func main() {
    result := 0
    for i := 1; 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
}

輸出結(jié)果為:

fibonacci(1) is: 1
fibonacci(2) is: 1
fibonacci(3) is: 2
fibonacci(4) is: 3
fibonacci(5) is: 5
fibonacci(6) is: 8
fibonacci(7) is: 13
fibonacci(8) is: 21
fibonacci(9) is: 34
fibonacci(10) is: 55

數(shù)字階乘

一個(gè)正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積,并且 0 的階乘為 1,自然數(shù) n 的階乘寫(xiě)作
n!,“基斯頓·卡曼”在 1808 年發(fā)明了
n!這個(gè)運(yùn)算符號(hào)。

例如,
n!=1×2×3×…×n,階乘亦可以遞歸方式定義:
0!=1,n!=(n-1)!×n。

使用遞歸函數(shù)計(jì)算給定數(shù)的階乘,示例代碼如下所示:

package main

import "fmt"

func Factorial(n uint64) (result uint64) {
    if n > 0 {
        result = n * Factorial(n-1)
        return result
    }
    return 1
}

func main() {
    var i int = 10
    fmt.Printf("%d 的階乘是 %d\n", i, Factorial(uint64(i)))
}

輸出結(jié)果為:

10 的階乘是 3628800

多個(gè)函數(shù)組成遞歸

Go語(yǔ)言中也可以使用相互調(diào)用的遞歸函數(shù),多個(gè)函數(shù)之間相互調(diào)用形成閉環(huán),因?yàn)镚o語(yǔ)言編譯器的特殊性,這些函數(shù)的聲明順序可以是任意的,下面這個(gè)簡(jiǎn)單的例子展示了函數(shù) odd 和 even 之間的相互調(diào)用:

package main
import (
    "fmt"
)
func main() {
    fmt.Printf("%d is even: is %t\n", 16, even(16)) // 16 is even: is true
    fmt.Printf("%d is odd: is %t\n", 17, odd(17))
    // 17 is odd: is true
    fmt.Printf("%d is odd: is %t\n", 18, odd(18))
    // 18 is odd: is false
}
func even(nr int) bool {
    if nr == 0 {
        return true
    }
    return odd(RevSign(nr) - 1)
}
func odd(nr int) bool {
    if nr == 0 {
        return false
    }
    return even(RevSign(nr) - 1)
}
func RevSign(nr int) int {
    if nr < 0 {
        return -nr
    }
    return nr
}

運(yùn)行效果如下所示:

16 is even: is true
17 is odd: is true
18 is odd: is false


名稱欄目:創(chuàng)新互聯(lián)GO教程:Go語(yǔ)言遞歸函數(shù)
網(wǎng)頁(yè)URL:http://www.dlmjj.cn/article/cdgdejj.html