版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、c 語(yǔ)言遞歸調(diào)用例子【篇一:c語(yǔ)言遞歸調(diào)用例子】* 小編已將正確代碼放在左側(cè)任務(wù)的 “不知道怎么辦”里* 小編希望各位童鞋獨(dú)立完成哦*/定義一個(gè)函數(shù), 傳送人員序號(hào)進(jìn)去,返回該序號(hào)員工的年齡。 int getage(numpeople) /定義返回的年齡 int age; /如果 是第 1 個(gè)人的時(shí)候,年齡為 10 歲 if(numpeople=1) age=10; / 這是回推墻,也就是結(jié)束遞歸的條件 else /還沒(méi)接觸到回推墻,就自我調(diào)用,謂之遞歸。 age = getage(numpeople-1) / 年齡等于上一個(gè) 人的年齡加 2 return agej【in篇篇ain() pri
2、ntf( 語(yǔ)言遞年歸調(diào)用例子rurn o;一、基本內(nèi)容:c 語(yǔ)言中的函數(shù)可以遞歸調(diào)用,即:可以直接(簡(jiǎn)單遞歸)或間接 (間接遞歸)地自己調(diào)自己。要點(diǎn):1、c 語(yǔ)言函數(shù)可以遞歸調(diào)用。2、可以通過(guò)直接或間接兩種方式調(diào)用。目前只討論直接遞歸調(diào)用。二、遞歸條件 采用遞歸方法來(lái)解決問(wèn)題,必須符合以下三個(gè)條件:1、可以把要解決的問(wèn)題轉(zhuǎn)化為一個(gè)新問(wèn)題,而這個(gè)新的問(wèn)題的解決方法仍與原來(lái)的解決方法相同,只是所處理的對(duì)象有規(guī)律地遞增或 遞減。說(shuō)明:解決問(wèn)題的方法相同,調(diào)用函數(shù)的參數(shù)每次不同(有規(guī)律的 遞增或遞減),如果沒(méi)有規(guī)律也就不能適用遞歸調(diào)用。2、可以應(yīng)用這個(gè)轉(zhuǎn)化過(guò)程使問(wèn)題得到解決。說(shuō)明:使用其他的辦法比較麻
3、煩或很難解決,而使用遞歸的方法可 以很好地解決問(wèn)題。3、必定要有一個(gè)明確的結(jié)束遞歸的條件。說(shuō)明:一定要能夠在適當(dāng)?shù)牡胤浇Y(jié)束遞歸調(diào)用。不然可能導(dǎo)致系統(tǒng) 崩潰。三、遞歸實(shí)例例:使用遞歸的方法求n!當(dāng)n 1時(shí),求n!的問(wèn)題可以轉(zhuǎn)化為n*(n-1)啲新問(wèn)題。 比如 n=5:第一部分:5*4*3*2*1 n*(n-1)! 第二部分:4*3*2*1 (n-1)*(n-2)!第三部分:3*2*1 (n-2)(n-3)! 第四部分:2*1 (n-3)(n-4)!第五部分:1 (n-5)! 5-5=0,得到值1,結(jié)束遞歸。源程序:代碼如下:fac(int n)int t;if(n=1)|(n=0) return
4、 1;else t=n*fac(n-1);return t;main( )int m,y;printf(“enter m:”);scanf(“%d”,if(m 0) printf(“input data error!”);elsey=fac(m);printf(“%d! =%d ”,m,y);四、遞歸說(shuō)明1、當(dāng)函數(shù)自己調(diào)用自己時(shí),系統(tǒng)將自動(dòng)把函數(shù)中當(dāng)前的變量和形參 暫時(shí)保留起來(lái),在新一輪的調(diào)用過(guò)程中,系統(tǒng)為新調(diào)用的函數(shù)所用 到的變量和形參開(kāi)辟另外的存 儲(chǔ)單元(內(nèi)存空間)。每次調(diào)用函數(shù) 所使用的變量在不同的內(nèi)存空間。2、遞歸調(diào) 用的層次越多,同名變量的占用的存儲(chǔ)單元也就越多。一定要記住, 每次函
5、數(shù)的調(diào)用,系統(tǒng)都會(huì)為該函數(shù)的變量開(kāi)辟新的內(nèi)存空間。3、當(dāng)本次調(diào)用的函數(shù)運(yùn)行結(jié)束時(shí),系統(tǒng)將釋放本次調(diào)用時(shí)所占用的 內(nèi)存空間。程序的流程返回到上一層的調(diào)用點(diǎn),同時(shí)取得當(dāng)初進(jìn)入 該層時(shí),函數(shù)中的變量和形參 所占用的內(nèi)存空間的數(shù)據(jù)。4、所有遞歸問(wèn)題都可以用非遞歸的方法來(lái)解決,但對(duì)于一些比較復(fù) 雜的遞歸問(wèn)題用非遞歸的方法往往使程序變得十分復(fù)雜難以讀懂, 而函數(shù)的遞歸調(diào)用在解決這類 問(wèn)題時(shí)能使程序簡(jiǎn)潔明了有較好的可 讀性;但由于遞歸調(diào)用過(guò)程中,系統(tǒng)要為每一層調(diào)用中的變量開(kāi)辟內(nèi)存空間、要記住每一層調(diào)用后的返回點(diǎn)、要增加許多額外的 開(kāi)銷, 因此函數(shù)的遞歸調(diào)用通常會(huì)降低程序的運(yùn)行效率。五、程序流程 代碼如下:
6、fac(int n) /*每次調(diào)用使用不同的參數(shù)*/ int t; /*每次調(diào)用都會(huì)為變量 t 開(kāi)辟不同的內(nèi)存空間*/ if(n=1)|(n=0) /*當(dāng)滿足這些條件返回 1 */ return 1;else t=n*fac(n-1); /*每次程序運(yùn)行到此處就會(huì)用 n-1 作為參數(shù)再調(diào)用一 次本函數(shù),此處是調(diào)用點(diǎn)*/return t; /*只有在上一句調(diào)用的所有過(guò)程全部結(jié)束時(shí)才運(yùn)行到此處。*/ 一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為 遞歸函數(shù)。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù) 又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn) 入新的一層。例如有函
7、數(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)然是不正確的。為了防止遞歸調(diào)用無(wú)終止地進(jìn)行,必須在函數(shù) 內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條 件后就不再作遞歸調(diào)用,然后逐層返回。下面舉例說(shuō)明遞歸調(diào)用的 執(zhí)行過(guò)程。【例 8.5】用遞歸法計(jì)算 n!用遞歸法計(jì)算n!可用下述公式表示:n!=1 (n=0,1)按公式可編程如下:long ff(int n)long f;if(n 0) printf(n 0,input error);else if(n=0|n=1) f
8、=1;else f=ff(n-1)*n;return(f);main()int n;long y;printf(input a inteager number:);scanf(%d,y=ff(n);printf(%d!=%ld,n,y);程序中給出的函數(shù)什是一個(gè)遞歸函數(shù)。主函數(shù)調(diào)用f后即進(jìn)入函數(shù) ff執(zhí)行,如果n 0,n=0或n=1時(shí)都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸 調(diào)用什函數(shù)自身。由于每次遞歸調(diào)用的實(shí)參為n-1,即把n-1的值賦 予形參n,最后當(dāng)n-1的值為1時(shí)再作遞歸調(diào)用,形參n的值也為1, 將使遞歸終止。然后可逐層退回。 下面我們?cè)倥e例說(shuō)明該過(guò)程。設(shè)執(zhí)行本程序時(shí)輸入為 5,即求 5!。在
9、主函數(shù)中的調(diào)用語(yǔ)句即為y=ff(5),進(jìn)入ff函數(shù)后,由于n=5,不等于 0或1,故應(yīng)執(zhí)行f=ff(n-1)*n,即(=(口5-1)*5。該語(yǔ)句對(duì)ff作遞歸調(diào)用 即 ff(4)。進(jìn)行四次遞歸調(diào)用后,ff函數(shù)形參取得的值變?yōu)?,故不再繼續(xù)遞歸 調(diào)用而開(kāi)始逐層返回主調(diào)函數(shù)。ff(1)的函數(shù)返回值為1, f(2)的返回值為1*2=2, ff(3)的返回值為2*3=6, f(4)的返回值為6*4=24,最后返回值 f(5)為 24*5=120。例8.5也可以不用遞歸的方法來(lái)完成。如可以用遞推法,即從1 開(kāi)始 乘以2,再乘以3直到n。遞推法比遞歸法更容易理解和實(shí)現(xiàn)。但是有些問(wèn)題則只能用遞歸算法才能實(shí)現(xiàn)。
10、典型的問(wèn)題是 hanoi 塔問(wèn) 題?!纠?8.6】hanoi 塔問(wèn)題一塊板上有三根針,a, b, c。a針上套有64個(gè)大小不等的圓盤, 大的在下,小的在上。如圖5.4所示。要把這64個(gè)圓盤從a針移動(dòng) c針上,每次只能移動(dòng)一個(gè)圓盤,移動(dòng)可以借助b針進(jìn)行。但在任何時(shí)候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動(dòng)的 步驟。本題算法分析如下,設(shè)a上有n個(gè)盤子。 如果n=1,則將圓盤從a直接移動(dòng)到c。如果n=2,貝0:1將a上的n-1(等于1)個(gè)圓盤移到b上;2再將a上的一個(gè)圓盤移到c上;3最后將b上的n-1(等于1)個(gè)圓盤移到c上。如果n=3,貝0:a.將a上的n-1(等于2, 令其為n、)個(gè)
11、圓盤移到b(借助于c),步驟 如下:將a上的n、-1(等于1)個(gè)圓盤移到c上。 (2)將 a上的一個(gè)圓盤移到b。將c上的n、-1(等于1)個(gè)圓盤移到bo b. 將 a 上的一個(gè)圓盤移到 c。c.將b上的n-1(等于2,令其為n、)個(gè)圓盤移到c(借助a),步驟如 下:將b上的n、-1(等于1)個(gè)圓盤移到a。(2)將 b上的一個(gè)盤子移到Co將a上的n、-1(等于1)個(gè)圓盤移到co 到此,完成了三個(gè)圓盤的移動(dòng)過(guò)程。從上面分析可以看出,當(dāng)n大于等于2時(shí),移動(dòng)的過(guò)程可分解為三 個(gè)步驟:第一步把a(bǔ)上的n-1個(gè)圓盤移到b上;第二步 把 a 第二步 把 a 上的一個(gè)盤移到c上;第三步把b上的n-1個(gè)圓盤移到c
12、上;其中第一步和第三步是類同 的。當(dāng)n=3時(shí),第一步和第三步又分解為類同的三步,即把n-1個(gè)圓盤 從一個(gè)針移到另一個(gè)針上,這里的n=n-1。顯然這是一個(gè)遞歸過(guò)程,據(jù)此算法可編程如下:move(int n,int x,int y,int z)if(n=1)printf(%c- %c,x,z);elsemove(n-1,x,z,y); printf(%c- %c,x,z); move(n-1,y,x,z); main() int h; printf(input number:); scanf(%d, printf(the step to moving %2d diskes:,h); move(h,
13、a,b,c);從程序中可以看出,move函數(shù)是一個(gè)遞歸函數(shù),它有四個(gè)形參 n,x,y,z。n表示圓盤數(shù),x,y,z分別表示三根針。move函數(shù)的功能 是把x上的n個(gè)圓盤移動(dòng)到z上。當(dāng)n=1時(shí),直接把x上的圓盤 移至z上,輸出xtz。如n!=1則分為三步:遞歸調(diào)用move函數(shù), 把n-1個(gè)圓盤從x移到y(tǒng);輸出xtz;遞歸調(diào)用move函數(shù),把n-1 個(gè)圓盤從y移到z。在遞歸調(diào)用過(guò)程中n=n-1,故n的值逐次遞減, 最后n=1時(shí),終止遞歸,逐層返回。當(dāng)n=4時(shí)程序運(yùn)行的結(jié)果為: input number:4the step to moving 4 diskes:ab ac bc ab ca cb a
14、b ac bc ba ca bc ab ac bc【篇三:c語(yǔ)言遞歸調(diào)用例子】 一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用,這種函數(shù)稱為 遞歸函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新 的一層?!臼纠坑眠f歸計(jì)算n!。階乘n!的計(jì)算公式如下: 根據(jù)公式編程:long factorial(int n) long result; if(n=0 | n=1) result =1; else result = factorial(n-l) * n; / 遞歸調(diào)用 return result;這是 一個(gè)典型的遞歸函數(shù)。調(diào)用factorial后即進(jìn)入函數(shù)體,只有當(dāng)n=0 或n=1時(shí)函數(shù)才會(huì)執(zhí)行結(jié)束,否則就一直調(diào)用它自身。由于每次調(diào)用的實(shí)參為n-1,即把n-1的值賦給形參n,所以每次遞 歸實(shí)參的值都減1,直到最后n-1的值為1時(shí)再作遞歸調(diào)用,形參n 的值也為1,遞歸就終止了,會(huì)逐層退出。例如求5!,即調(diào)用factoriaK5)。當(dāng)進(jìn)入factorial函數(shù)體后,由于 n=5,不等于 0 或 1,所以執(zhí)行 result = factorial(n-1) * n;,即 卩 result = factorial(5-1) * 5;,接下來(lái)也就是調(diào)用 factorial。這是 第一次遞歸。進(jìn)行四次遞歸調(diào)用后,實(shí)參的值為1,也就是調(diào)用factorial。)。這 時(shí)遞歸就結(jié)束了,開(kāi)始逐層返回
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年二手手機(jī)銷售協(xié)議
- 婚慶合作股協(xié)議合同模板
- 2024年會(huì)計(jì)人員派遣協(xié)議
- 加盟合同正規(guī)合同模板
- 2024年交通行業(yè)信息化建設(shè)框架協(xié)議
- 占道賠償合同模板
- 2024年grocery運(yùn)輸服務(wù)協(xié)議
- 2024年臨時(shí)租賃合同模板:臨時(shí)租賃協(xié)議范本
- 低溫倉(cāng)儲(chǔ)的績(jī)效管理與激勵(lì)機(jī)制考核試卷
- 危險(xiǎn)品倉(cāng)儲(chǔ)作業(yè)現(xiàn)場(chǎng)安全技巧考核試卷
- 邊坡土石方開(kāi)挖施工方案
- 八年級(jí)上冊(cè)語(yǔ)文課后習(xí)題及答案匯編(部分不全)
- 玻璃廠應(yīng)急預(yù)案
- 安全帽生產(chǎn)與使用管理規(guī)范
- 貨車進(jìn)入車間安全要求
- 2022年中國(guó)出版業(yè)總體狀況分析
- 新版深度學(xué)習(xí)完整整套教學(xué)課件
- 2023學(xué)年完整公開(kāi)課版冰雕史話
- BIM大賽題庫(kù)含答案
- 羅馬人的故事(全15冊(cè))(修訂版)
- 單位無(wú)宿舍證明
評(píng)論
0/150
提交評(píng)論