国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

深入解析Go語言編程中的遞歸使用

2020-04-01 19:12:14
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Go語言編程中的遞歸使用,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
 

遞歸是以相似的方式重復(fù)項目的過程。同樣適用于編程語言中,如果一個程序可以讓你調(diào)用同一個函數(shù)被調(diào)用的函數(shù),遞歸調(diào)用函數(shù)內(nèi)使用如下。

復(fù)制代碼代碼如下:

func recursion() {
   recursion() /* function calls itself */
}

 

func main() {
   recursion()
}


Go編程語言支持遞歸,即要調(diào)用的函數(shù)本身。但是在使用遞歸時,程序員需要謹(jǐn)慎確定函數(shù)的退出條件,否則會造成無限循環(huán)。

 

遞歸函數(shù)是解決許多數(shù)學(xué)問題想計算一個數(shù)階乘非常有用的,產(chǎn)生斐波系列等

數(shù)字階乘
以下是一個例子,它計算階乘用于使用一個遞歸函數(shù)由給定數(shù):

復(fù)制代碼代碼如下:

package main

 

import "fmt"

func factorial(i int) {
   if(i <= 1) {
      return 1
   }
   return i * factorial(i - 1)
}

func main {  
    var i int = 15
    fmt.Printf("Factorial of %d is %d/n", i, factorial(i))
}


讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:
復(fù)制代碼代碼如下:

Factorial of 15 is 2004310016

斐波那契系列
以下是另一個例子,其產(chǎn)生斐波串聯(lián)使用一個遞歸函數(shù)由給定一個數(shù):
復(fù)制代碼代碼如下:

package main

 

import "fmt"

func fibonaci(i int) {
   if(i == 0) {
      return 0
   }
   if(i == 1) {
      return 1
   }
   return fibonaci(i-1) + fibonaci(i-2)
}

func main() {
    var i int
    for i = 0; i < 10; i++ {
       fmt.Printf("%d/t%n", fibonaci(i))
    }    
}


讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:
  1. 0 1 1 2 3 5 8 13 21 34 

 

 

golang 遞歸判斷回文字符串
判斷回文字符串是個比較經(jīng)典的問題。

思路就是拿第一個字符和最一個字符比較,如果不等退出,相同的話繼續(xù)剛剛的過程,直到第一個字符和最后一個字符相遇或者他們的距離為1時。說明他們是回文字符串。

下面的代碼會忽略空白字符 如"1   1  2 1"會讓為是回文字符串。

復(fù)制代碼代碼如下:

package main

 

import (
    "fmt"
    "os"
    "strings"
    "unicode/utf8"
)

func doPalindrome(s string) bool {
    if utf8.RuneCountInString(s) <= 1 { 
        return true
    }  

    word := strings.Trim(s, "/t /r/n/v")
    first, sizeOfFirst := utf8.DecodeRuneInString(word)
    last, sizeOfLast := utf8.DecodeLastRuneInString(word)

    if first != last {
        return false
    }   
    return doPalindrome(word[sizeOfFirst : len(word)-sizeOfLast])
}

func IsPalindrome(word string) bool {
    s := ""
    s = strings.Trim(word, "/t /r/n/v")
    if len(s) == 0 || len(s) == 1 { 
        return false
    }   
    return doPalindrome(s)
}

func main() {
    args := os.Args[1:]
    for _, v := range args {
        ok := IsPalindrome(v)
        if ok {
            fmt.Printf("%s/n", v)
        }   
    }  

}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 凉山| 桐柏县| 固原市| 乐山市| 开化县| 柘荣县| 北安市| 建德市| 光泽县| 龙海市| 萍乡市| 阜平县| 诸暨市| 北安市| 塔城市| 宾川县| 庄浪县| 富源县| 梁山县| 密山市| 汉源县| 平遥县| 宣汉县| 巴彦县| 彝良县| 阜新市| 德庆县| 海原县| 镇雄县| 绵竹市| 喀什市| 东辽县| 贵溪市| 阿拉善右旗| 梓潼县| 萝北县| 奉节县| 密山市| 桓台县| 措美县| 侯马市|