go語(yǔ)言遞歸函數(shù)原文 go語(yǔ)言函數(shù)和方法

GO語(yǔ)言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

GO是編譯性語(yǔ)言,所以函數(shù)的順序是無(wú)關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫(xiě)在最前面,其余函數(shù)按照功能需要進(jìn)行排列

成都創(chuàng)新互聯(lián)公司2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元資中做網(wǎng)站,已為上家服務(wù),為資中各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):13518219792

GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)

GO的函數(shù) 支持 無(wú)需聲明變量,可變長(zhǎng)度,多返回值,匿名,閉包等

GO的函數(shù)用 func 來(lái)聲明,且左大括號(hào) { 不能另起一行

一個(gè)簡(jiǎn)單的示例:

輸出為:

參數(shù):可以傳0個(gè)或多個(gè)值來(lái)供自己用

返回:通過(guò)用 return 來(lái)進(jìn)行返回

輸出為:

上面就是一個(gè)典型的多參數(shù)傳遞與多返回值

對(duì)例子的說(shuō)明:

按值傳遞:是對(duì)某個(gè)變量進(jìn)行復(fù)制,不能更改原變量的值

引用傳遞:相當(dāng)于按指針傳遞,可以同時(shí)改變?cè)瓉?lái)的值,并且消耗的內(nèi)存會(huì)更少,只有4或8個(gè)字節(jié)的消耗

在上例中,返回值 (d int, e int, f int) { 是進(jìn)行了命名,如果不想命名可以寫(xiě)成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

當(dāng)返回了多個(gè)值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來(lái)補(bǔ)位,例如上例的返回我們可以寫(xiě)成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來(lái)舍棄掉

在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個(gè)可變長(zhǎng)度的參數(shù)

輸出為:

在上例中, strs ...string 中, strs 的實(shí)際值是b,c,d,e,這就是一個(gè)最簡(jiǎn)單的傳遞可變長(zhǎng)度的參數(shù)的例子,更多一些演變的形式,都非常類(lèi)似

在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對(duì)像中的析構(gòu)函數(shù),也就是在某個(gè)函數(shù)執(zhí)行完成后,GO會(huì)自動(dòng)這個(gè);

如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進(jìn)后出;

當(dāng)某個(gè)函數(shù)出現(xiàn)嚴(yán)重錯(cuò)誤時(shí), defer 也會(huì)被調(diào)用

輸出為

這是一個(gè)最簡(jiǎn)單的測(cè)試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時(shí),判斷是哪個(gè)函數(shù)出了問(wèn)題,完全可以根據(jù) defer 打印出來(lái)的內(nèi)容來(lái)進(jìn)行判斷,非常快速,這種留給你們?nèi)?shí)現(xiàn)

一個(gè)函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱(chēng)之為遞歸函數(shù),在做遞歸調(diào)用時(shí),經(jīng)常會(huì)將內(nèi)存給占滿(mǎn),這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

本篇重點(diǎn)介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct

遞歸函數(shù)代碼示例

復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。例如,有函數(shù)f如下。

int f(int x)

{

int y;

z=f(y);

return z;

}

這個(gè)函數(shù)是一個(gè)遞歸函數(shù),但是運(yùn)行該函數(shù)將無(wú)休止的調(diào)用自身,這當(dāng)然是不正確的,在此只是給你舉個(gè)簡(jiǎn)單的例子而已。為了防止調(diào)用無(wú)休止的進(jìn)行,必須加條件判斷,滿(mǎn)足某種條件后就不再做遞歸調(diào)用,然后逐層返回。在此舉例說(shuō)明遞歸調(diào)用的執(zhí)行過(guò)程。

用遞歸法計(jì)算n!.

long f(int i)

{

if(n0) printf("input error");return;

else if(i==0||i==1) return 1;

else return i*f(i-1);

}

main()

{

int n;

printf("please input n:\n");

scanf("%d",n);

printf("%d=%id\n",n,f(n));

}

程序中的f是一個(gè)遞歸函數(shù),如果n0,n==0或者n==1時(shí)將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用f函數(shù)自身。

假設(shè)輸入3,即求3!。進(jìn)入f函數(shù)i=3,不等于0或1,所以執(zhí)行i*f(i-1),即

3*f(2)。然后再遞歸調(diào)用f(2),2不等于0或1,所以執(zhí)行i*f(i-1),即2*f(1).繼續(xù)調(diào)用f(1),此時(shí)1==1,結(jié)束函數(shù)的執(zhí)行。

所以返回的結(jié)果是3*f(2)=3*2*f(1)=3*2*1=6.

希望你可以看懂,我感覺(jué)蠻簡(jiǎn)單的。

go語(yǔ)言遞歸掃描指定目錄下文件

使用go語(yǔ)言遞歸查找指定目錄下的文件,根據(jù)正則匹配篩選出需要的文件,并且忽略指定的目錄

先使用 ioutil.ReadDir 遍歷出指定目錄下的文件,再遞歸進(jìn)目錄中遍歷,問(wèn)題的關(guān)鍵在于識(shí)別出文件為目錄, fs.FileInfo 中有一個(gè) IsDir() 函數(shù)可以識(shí)別是否是目錄

正則匹配使用 regexp.MatchString ,regexp中有很多正則操作的工具,如根據(jù)正則替換字符串中的指定字符

遞歸函數(shù)詳細(xì)運(yùn)行過(guò)程

我給你簡(jiǎn)單寫(xiě)了一個(gè)經(jīng)典的遞歸函數(shù)(求階乘)

#includestdio.h

int fun(int n)

{

printf("test...\n");//先幫助你理解遞歸的基本過(guò)程

if(n==0)

return 1;

else

return n*fun(n-1);

}

void main()

{

int n;

printf("輸入一個(gè)整數(shù): ");

scanf("%d",n);

printf("result=%d\n",fun(n));

}

當(dāng)一個(gè)問(wèn)題具有如下特征時(shí),可用遞歸求解:

1.大問(wèn)題能分解成若干個(gè)子問(wèn)題;

2.子問(wèn)題或者是一個(gè)定值或者是與大問(wèn)題具有相同性質(zhì)的問(wèn)題;

3.子問(wèn)題在最小尺度上有直接解,即過(guò)程能朝著問(wèn)題結(jié)束的方向發(fā)展(遞歸結(jié)束條件);

首先,遞歸是通過(guò)棧實(shí)現(xiàn)的,若沒(méi)有遇到結(jié)束條件,入棧保存本次調(diào)用的返回地址,局部變量,形式參數(shù)等值。

比如計(jì)算上面的fun(3)過(guò)程:

執(zhí)行時(shí)遇到fun(2),保存當(dāng)前的n(n=3)以及fun(2)執(zhí)行完后的返回地址;然后繼續(xù)執(zhí)行,繼續(xù)對(duì)局部變量和函數(shù)返回地址入棧保存。直到遇到遞歸結(jié)束條件,開(kāi)始彈棧,這是將棧頂n域值恢復(fù)給n,棧頂?shù)刂酚蜃鳛榉祷氐刂烦鰲?,繼續(xù)這樣下去,直到??眨罱K所得的n就是所要求得值。

不知道這樣的描述你能不能懂。總之,利用棧的先進(jìn)先出特性,先往下遞推,遇到結(jié)束條件后回溯(彈棧求結(jié)果,最后返回),對(duì)于地址的相關(guān)問(wèn)題,如果你學(xué)匯編語(yǔ)言就會(huì)懂了。。。

你可以畫(huà)棧的圖理解求階乘的過(guò)程,對(duì)遞歸的理解絕對(duì)有幫助。希望對(duì)你有用。。。

func函數(shù)是干什么的?

Func函數(shù)是包含在Function和End Function語(yǔ)句之間的一組VBScript語(yǔ)句。

Func函數(shù)與Sub過(guò)程類(lèi)似。但Func函數(shù)可以有返回值??梢允褂脜?shù)。如果Func函數(shù)沒(méi)有任何參數(shù),則Function語(yǔ)句必須要包含空括號(hào)。Func函數(shù)通過(guò)函數(shù)名返回一個(gè)值。返回值的數(shù)據(jù)類(lèi)型是Variant。

語(yǔ)法: Function 函數(shù)名 (參數(shù)1,參數(shù)2,...)

...

End Function

func在go語(yǔ)言中的使用:

在 Go 語(yǔ)言中,函數(shù)聲明通用語(yǔ)法如下:

func functionname(parametername type) returntype {??

// 函數(shù)體(具體實(shí)現(xiàn)的功能)

}

函數(shù)的聲明以關(guān)鍵詞 func 開(kāi)始,后面緊跟自定義的函數(shù)名 functionname (函數(shù)名)。函數(shù)的參數(shù)列表定義在 ( 和 ) 之間,返回值的類(lèi)型則定義在之后的 returntype (返回值類(lèi)型)處。

聲明一個(gè)參數(shù)的語(yǔ)法采用 參數(shù)名 參數(shù)類(lèi)型 的方式,任意多個(gè)參數(shù)采用類(lèi)似 (parameter1 type, parameter2 type) 即(參數(shù)1 參數(shù)1的類(lèi)型,參數(shù)2 參數(shù)2的類(lèi)型)的形式指定。之后包含在 { 和 } 之間的代碼,就是函數(shù)體。

怎么用遞歸實(shí)現(xiàn)1-10的求和 golang

1、打出主函數(shù)defs(n):ifn=1。

2、在打出條件函數(shù)return1else:result=n+s(n-1)return.result。

3、最后結(jié)尾返回函數(shù)的值result=s(10)print(result)。

本文題目:go語(yǔ)言遞歸函數(shù)原文 go語(yǔ)言函數(shù)和方法
網(wǎng)址分享:http://muchs.cn/article18/hjdpdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)手機(jī)網(wǎng)站建設(shè)網(wǎng)站制作、靜態(tài)網(wǎng)站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名