版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
遞歸函數(shù)/11/261/56一個(gè)經(jīng)過(guò)重復(fù)將問(wèn)題分解為同類(lèi)子問(wèn)題從而處理問(wèn)題方法“Thepowerofrecursionevidentlyliesinthepossibilityofdefininganinfinitesetofobjectsbyafinitestatement.Inthesamemanner,aninfinitenumberofcomputationscanbedescribedbyafiniterecursiveprogram,evenifthisprogramcontainsnoexplicitrepetitions.”NiklausWirth遞歸2/56階乘n!=n*(n-1)!Fibonacci數(shù)列
f(n)=f(n-1)+f(n-2)…什么問(wèn)題適合遞歸處理?3/56函數(shù)遞歸調(diào)用在調(diào)用一個(gè)函數(shù)過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱(chēng)為函數(shù)遞歸調(diào)用。4/56f2函數(shù)調(diào)用f1函數(shù)函數(shù)遞歸調(diào)用f函數(shù)調(diào)用f函數(shù)f1函數(shù)調(diào)用f2函數(shù)直接調(diào)用本函數(shù)間接調(diào)用本函數(shù)5/56函數(shù)遞歸調(diào)用
例7.6有5個(gè)學(xué)生坐在一起問(wèn)第5個(gè)學(xué)生多少歲?他說(shuō)比第4個(gè)學(xué)生大2歲問(wèn)第4個(gè)學(xué)生歲數(shù),他說(shuō)比第3個(gè)學(xué)生大2歲問(wèn)第3個(gè)學(xué)生,又說(shuō)比第2個(gè)學(xué)生大2歲問(wèn)第2個(gè)學(xué)生,說(shuō)比第1個(gè)學(xué)生大2歲最終問(wèn)第1個(gè)學(xué)生,他說(shuō)是10歲請(qǐng)問(wèn)第5個(gè)學(xué)生多大6/56函數(shù)遞歸調(diào)用解題思緒:要求第5個(gè)年紀(jì),就必須先知道第4個(gè)年紀(jì)要求第4個(gè)年紀(jì)必須先知道第3個(gè)年紀(jì)第3個(gè)年紀(jì)又取決于第2個(gè)年紀(jì)第2個(gè)年紀(jì)取決于第1個(gè)年紀(jì)每個(gè)學(xué)生年紀(jì)都比其前1個(gè)學(xué)生年紀(jì)大27/567.6函數(shù)遞歸調(diào)用解題思緒:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=108/56age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18
遞歸邊界9/56#include<stdio.h>intage(intn);intmain(){printf("NO.5,age:%d\n",age(5));return0;}
intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}10/56age(5)輸出age(5)mainc=age(4)+2age函數(shù)n=5c=age(3)+2age函數(shù)n=4c=age(1)+2age函數(shù)n=2c=age(2)+2age函數(shù)n=3c=10age函數(shù)n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=181811/56例7.7用遞歸方法求n!。解題思緒:求n!能夠用遞推方法:即從1開(kāi)始,乘2,再乘3……一直乘到n。遞推法特點(diǎn)是從一個(gè)已知事實(shí)(如1!=1)出發(fā),按一定規(guī)律推出下一個(gè)事實(shí)(如2!=1!*2),再?gòu)倪@個(gè)新已知事實(shí)出發(fā),再向下推出一個(gè)新事實(shí)(3!=3*2!)。n!=n*(n-1)!。12/56例7.7用遞歸方法求n!。解題思緒:求n!也能夠用遞歸方法,即5!等于4!×5,而4!=3!×4…,1?。剑笨捎孟旅孢f歸公式表示:13/56#include<stdio.h>intfac(intn);intmain(){intn=0;inty=0;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%d\n",n,y);return0;}14/56intfac(intn){intf;if(n<0) printf("n<0,dataerror!");elseif(n==0||n==1) f=1;elsef=fac(n-1)*n;returnf;}注意溢出15/56fac(5)輸出fac(5)mainf=fac(4)×5fac函數(shù)n=5f=fac(3)×4fac函數(shù)n=4f=fac(1)×2fac函數(shù)n=2f=fac(2)×3fac函數(shù)n=3f=1fac函數(shù)n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=12012016/56
例7.8漢諾塔(Hanoitower)問(wèn)題。古代有一個(gè)梵塔,塔內(nèi)有3個(gè)座A、B、C,開(kāi)始時(shí)A座上有64個(gè)盤(pán)子,盤(pán)子大小不等,大在下,小在上。有一個(gè)老和尚想把這64個(gè)盤(pán)子從A座移到C座,但要求每次只允許移動(dòng)一個(gè)盤(pán),且在移動(dòng)過(guò)程中在3個(gè)座上都一直保持大盤(pán)在下,小盤(pán)在上。在移動(dòng)過(guò)程中能夠利用B座。要求編程序輸出移動(dòng)盤(pán)子步驟。17/5664個(gè)盤(pán)子從A座移動(dòng)到C座,需要移動(dòng)大約264
次盤(pán)子,每1秒移動(dòng)1次,則需約5840億年18/56思緒:假如有另外一個(gè)和尚能有方法將上面63個(gè)盤(pán)子從一個(gè)座移到另一座。那么,問(wèn)題就處理了。此時(shí)老和尚只需這么做:19/56轉(zhuǎn)化為遞歸形式:(1)命令第2個(gè)和尚將63個(gè)盤(pán)子從A座移到B座(2)自己將1個(gè)盤(pán)子(最底下、最大盤(pán)子)從A座移到C座(3)再命令第2個(gè)和尚將63個(gè)盤(pán)子從B座移到C座20/56ABC……將63個(gè)從A到B第1個(gè)和尚做法21/56……ABC讓第2個(gè)和尚將63個(gè)從A到B第1個(gè)和尚做法22/56……ABC自己將1個(gè)從A到C第1個(gè)和尚做法23/56……ABC自己將1個(gè)從A到C第1個(gè)和尚做法24/56……ABC讓第2個(gè)和尚將63個(gè)從B到C第1個(gè)和尚做法25/56……ABC讓第2個(gè)和尚將63個(gè)從B到C第1個(gè)和尚做法26/56ABC……將62個(gè)從A到C第2個(gè)和尚做法27/56ABC……讓第3個(gè)和尚將62個(gè)從A到C第2個(gè)和尚做法28/56ABC……自己將1個(gè)從A到B第2個(gè)和尚做法29/56ABC……自己將1個(gè)從A到B第2個(gè)和尚做法30/56ABC……讓第3個(gè)和尚將62個(gè)從C到B第2個(gè)和尚做法31/56ABC……讓第3個(gè)和尚將62個(gè)從C到B第2個(gè)和尚做法32/56第3個(gè)和尚做法第4個(gè)和尚做法第5個(gè)和尚做法第6個(gè)和尚做法第7個(gè)和尚做法……第63個(gè)和尚做法第64個(gè)和尚僅做:將1個(gè)從A移到C33/56ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從A移到B34/56ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從A移到B35/56ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將1個(gè)盤(pán)子從A移到C36/56ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將1個(gè)盤(pán)子從A移到C37/56ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從B移到C38/56ABC將3個(gè)盤(pán)子從A移到C全過(guò)程將2個(gè)盤(pán)子從B移到C39/56ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到C40/56ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到C41/56ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到B42/56ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從A移到B43/56ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從C移到B44/56ABC將2個(gè)盤(pán)子從A移到B過(guò)程將1個(gè)盤(pán)子從C移到B45/56ABC將2個(gè)盤(pán)子從B移到C過(guò)程46/56ABC將2個(gè)盤(pán)子從B移到C過(guò)程47/56ABC將2個(gè)盤(pán)子從B移到C過(guò)程48/56ABC將2個(gè)盤(pán)子從B移到C過(guò)程49/56由上面分析可知:將n個(gè)盤(pán)子從A座移到C座能夠分解為以下3個(gè)步驟:(1)將A上n-1個(gè)盤(pán)借助C座先移到B座上(2)把A座上剩下一個(gè)盤(pán)移到C座上(3)將n-1個(gè)盤(pán)從B座借助于A座移到C座上50/56能夠?qū)⒌?1)步和第(3)步表示為:將“one”座上n-1個(gè)盤(pán)移到“two”座(借助“three”座)。在第(1)步和第(3)步中,one、two、three和A、B、C對(duì)應(yīng)關(guān)系不一樣。對(duì)第(1)步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)A,two對(duì)應(yīng)B,three對(duì)應(yīng)C。對(duì)第(3)步,對(duì)應(yīng)關(guān)系是one對(duì)應(yīng)B,two對(duì)應(yīng)C,three對(duì)應(yīng)A。51/56把上面3個(gè)步驟分成兩類(lèi)操作:(1)將n-1個(gè)盤(pán)從一個(gè)座移到另一個(gè)座上(n>1)。這就是大和尚讓小和尚做工作,它是一個(gè)遞歸過(guò)程,即和尚將任務(wù)層層下放,直到第64個(gè)和尚為止。(2)將1個(gè)盤(pán)子從一個(gè)座上移到另一座上。這是大和尚自己做工作。52/56編寫(xiě)程序。用hanoi函數(shù)實(shí)現(xiàn)第1類(lèi)操作(即模擬小和尚任務(wù))用move函數(shù)實(shí)現(xiàn)第2類(lèi)操作(模擬大和尚自己移盤(pán))函數(shù)調(diào)用hanoi(n,one,two.three)表示將n個(gè)盤(pán)子從“one”座移到“three”座過(guò)程(借助“two”座)函數(shù)調(diào)用move(x,y)表示將1個(gè)盤(pán)子從x座移到y(tǒng)座過(guò)程。x和y是代表A、B、C座之一,依據(jù)每次不一樣情況分別取A、B、C代入53/56#include<stdio.h>intmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf(“thenumberofdiskes:");scanf("%d",&m);printf("move%ddiskes:\n",m);
hanoi(m,'A','B','C');}54/56voidhanoi(intn,charone,chartwo,charthree){
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生產(chǎn)線培訓(xùn)新員工
- 2024兒童用藥安全
- 陜西省西安市新城區(qū)多校2023-2024學(xué)年三年級(jí)上學(xué)期月考英語(yǔ)試卷
- 電動(dòng)車(chē)消防安全預(yù)防電動(dòng)車(chē)火災(zāi)培訓(xùn)課件
- 天津市河?xùn)|區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期中數(shù)學(xué)試卷(含答案)
- 山東省濱州市博興縣 2024-2025學(xué)年八年級(jí)上學(xué)期11月期中道德與法治試題(含答案)
- 2024-2025學(xué)年山東省日照市日照一中高二(上)第一次質(zhì)檢數(shù)學(xué)試卷(含答案)
- 江蘇省蘇州市2024-2025學(xué)年第一學(xué)期初三化學(xué)期中模擬測(cè)試卷(七)(含解析)
- 福建省南平市延平區(qū)多校2024-2025學(xué)年四年級(jí)上學(xué)期期中語(yǔ)文試題
- 信息技術(shù)(第2版)(拓展模塊) 教案 項(xiàng)目五 Web和FTP服務(wù)器的配置與管理
- 《Vue 3基礎(chǔ)入門(mén)》課件 第一章 vue 3簡(jiǎn)介
- 【7道人教版期中】安徽省合肥市琥珀中學(xué)+2023-2024學(xué)年七年級(jí)上學(xué)期11月期中道德與法治試題(含解析)
- GB/T 31486-2024電動(dòng)汽車(chē)用動(dòng)力蓄電池電性能要求及試驗(yàn)方法
- 口腔頜面部腫瘤概論(口腔頜面外科課件)
- 插畫(huà)風(fēng)浙江大學(xué)浙大介紹大學(xué)介紹
- 3.1細(xì)胞膜的結(jié)構(gòu)和功能說(shuō)課課件-高一上學(xué)期生物人教版(2019)必修1
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- 《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)》測(cè)試題+答案
- 2024年網(wǎng)上大學(xué)智能云服務(wù)交付工程師認(rèn)證考試題庫(kù)800題(含答案)
- 心血管內(nèi)科試題庫(kù)+答案
- 數(shù)據(jù)安全重要數(shù)據(jù)風(fēng)險(xiǎn)評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論