版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
3.3遞歸(棧的應(yīng)用)1.遞歸的定義2.基本思想3.遞歸要素3.遞歸應(yīng)用舉例
階乘函數(shù)漢諾塔問(wèn)題3.3遞歸1、遞歸(recursion)的定義遞歸:子程序(或函數(shù))直接調(diào)用自己或通過(guò)一系列調(diào)用語(yǔ)句間接調(diào)用自己,是一種描述問(wèn)題和解決問(wèn)題的基本方法。。遞歸按其調(diào)用方式可分為直接遞歸和間接遞歸:1、直接遞歸:自己調(diào)用自己。如:voidf(n){……f(n/2);……}2、間接遞歸:P調(diào)用D,D調(diào)用P;如:voidP(intn)voidD(intn){……{……D(n/3);P(n/2);…………}}2、遞歸的基本思想問(wèn)題分解:把一個(gè)不能或不好解決的大問(wèn)題轉(zhuǎn)化為一個(gè)或幾個(gè)小問(wèn)題,再把這些小問(wèn)題進(jìn)一步分解成更小的小問(wèn)題,直至每個(gè)小問(wèn)題都可以直接解決。
3、遞歸的要素⑴遞歸邊界條件:確定遞歸到何時(shí)終止,也稱為遞歸出口;⑵遞歸模式:大問(wèn)題是如何分解為小問(wèn)題的,也稱為遞歸體。
例1、定義是遞歸的:(1)階乘函數(shù)遞歸算法longunsignedfact(intn){ if(n==0)return1;
elsereturnn*fact(n-1);}-*=時(shí)當(dāng)時(shí)當(dāng)
)!1(
1!n≥1n=0nnn4、遞歸應(yīng)用舉例求解階乘n!的過(guò)程計(jì)算
fact(4)計(jì)算4*fact(3)計(jì)算3*fact(2)計(jì)算2*fact(1)計(jì)算fact(1)遞歸調(diào)用回歸求值返回24返回6返回2返回1(2)Fibonacci數(shù)列
0n=0Fib(n)=1n=1
Fib(n-1)+Fib(n-2)n>1011235813……遞歸算法longunsignedFib(intn){ if(n==0||n==1)returnn;//遞歸出口
elsereturnFib(n-1)+Fib(n-2);//遞歸調(diào)用}注:累計(jì)遞歸調(diào)用次數(shù):2*Fib(n+1)-1。例2、問(wèn)題的解法是遞歸的:
利用遞歸思想來(lái)求解某類(lèi)問(wèn)題(本身沒(méi)有明顯的遞歸結(jié)構(gòu),但操作方法可以用遞歸很好的描述)使其更為簡(jiǎn)單。如:漢諾塔問(wèn)題、背包問(wèn)題、八皇后問(wèn)題等。
(3)有的數(shù)據(jù)結(jié)構(gòu)如二叉樹(shù)、廣義表、圖等(如樹(shù)的遍歷、圖的搜索)定義。經(jīng)典問(wèn)題——漢諾塔問(wèn)題
在世界剛被創(chuàng)建的時(shí)候有一座鉆石寶塔(塔A),其上有64個(gè)金碟。所有碟子按從大到小的次序從塔底堆放至塔頂。緊挨著這座塔有另外兩個(gè)鉆石寶塔(塔B和塔C)。從世界創(chuàng)始之日起,婆羅門(mén)的牧師們就一直在試圖把塔A上的碟子移動(dòng)到塔C上去,其間借助于塔B的幫助。每次只能移動(dòng)一個(gè)碟子,任何時(shí)候都不能把一個(gè)碟子放在比它小的碟子上面。當(dāng)牧師們完成任務(wù)時(shí),世界末日也就到了。漢諾塔問(wèn)題的遞歸求解方法:如果n=1,則將這一個(gè)盤(pán)子直接從塔A移到塔C
上。否則,執(zhí)行以下三步:⑴將塔A上的n-1個(gè)碟子借助塔C先移到塔B上;⑵把塔A上剩下的一個(gè)碟子移到塔C上;⑶將n-1個(gè)碟子從塔B借助于塔A移到塔C上。
算法實(shí)現(xiàn):voidHanoi(intn,charA,charB,charC){
if(n==1)Move(A,C);
else{
Hanoi(n-1,A,C,B);
Move(A,C);
Hanoi(n-1,B,A,C);
}
}Hanio(3,A,B,C)Hanio(2,A,C,B)Hanio(1,A,B,C)Move(A,C)Move(A,B)Hanio(1,C,A,B)Hanio(1,A,B,C)Hanio(2,A,C,B)Move(C,B)Hanio(1,C,A,B)Move(A,C)Hanio(2,B,A,C)Hanio(1,B,C,A)Move(B,C)Hanio(1,A,B,C)Hanio(1,B,C,A)Move(A,C)Hanio(2,B,A,C)Move(B,A)Hanio(1,A,B,C)結(jié)束
漢諾塔遞歸調(diào)用過(guò)程:5、遞歸過(guò)程與遞歸工作棧非遞歸函數(shù)的調(diào)用,在函數(shù)調(diào)用前要保存以下三方面的信息:(1)返回地址(2)本函數(shù)調(diào)用時(shí),與形參結(jié)合的實(shí)參值,包括函數(shù)名和函數(shù)參數(shù)。(3)本函數(shù)的局部變量值。遞歸函數(shù)調(diào)用也須保存這些信息,使用“遞歸工作棧”來(lái)處理?;顒?dòng)記錄:棧頂?shù)墓ぷ饔涗洷囟ㄊ钱?dāng)前正在執(zhí)行的工作記錄.遞歸過(guò)程在實(shí)現(xiàn)時(shí),需要自己調(diào)用自己。層層向下遞歸,返回次序正好相反:遞歸調(diào)用
n!(n-1)!(n-2)!1!=1
返回次序遞歸函數(shù)的內(nèi)部執(zhí)行過(guò)程每一次遞歸調(diào)用時(shí),需要為過(guò)程中使用的參數(shù)、局部變量等另外分配存儲(chǔ)空間。每層遞歸調(diào)用需分配的空間形成遞歸工作記錄,按后進(jìn)先出的棧組織。局部變量返回地址值參活動(dòng)記錄框架遞歸工作記錄⑴運(yùn)行開(kāi)始時(shí),首先為遞歸調(diào)用建立一個(gè)工作棧,其結(jié)構(gòu)包括值參、局部變量和返回地址;⑵每次執(zhí)行遞歸調(diào)用之前,把遞歸函數(shù)的值參和局部變量的當(dāng)前值以及調(diào)用后的返回地址壓棧;⑶每次遞歸調(diào)用結(jié)束后,將棧頂元素出棧,使相應(yīng)的值參和局部變量恢復(fù)為調(diào)用前的值,然后轉(zhuǎn)向返回地址指定的位置繼續(xù)執(zhí)行。如:求解階乘n!,遞歸工作僅需保留4個(gè)參數(shù):函數(shù)名fact,參數(shù)n,局部變量x(存放fact(n-1)的值)和y(存放n*fact(n-1)的值)。參見(jiàn)P103.6、消除遞歸(P103
)原因:遞歸算法時(shí)間效率較差。(1)尾遞歸和單向遞歸算法,用帶循環(huán)結(jié)構(gòu)的算法來(lái)代替。(2)用自定義棧來(lái)模擬系統(tǒng)運(yùn)行時(shí)的棧,保存相關(guān)信息,用非遞歸算法來(lái)模擬遞歸算法。實(shí)例分析:(1)尾遞歸:遞歸調(diào)用語(yǔ)句只有一個(gè),且處于函數(shù)的最后。(可不用棧來(lái)存取相關(guān)信息)如階乘求解的非遞歸算法:longunsignedfact(intn){ longunsignedint
f=1; for(inti=1;i<=n;i++)
f=f*i; returnf;}(2)單向遞歸:各遞歸調(diào)用語(yǔ)句的參數(shù)只和主調(diào)用函數(shù)有關(guān),相互之間參數(shù)無(wú)關(guān),并且這些遞歸調(diào)用語(yǔ)句都處在算法的最后。如斐波那契數(shù)列非遞歸算法:longunsignedFib(intn)//用循環(huán)實(shí)現(xiàn){ if(n==0||n==1)returnn; longunsignedf1=0,f2=1,fn;
//求n>=2的情況
for(inti=2;i<=n;i++) {
fn=f1+f2; f1=f2; f2=fn; } returnfn;}時(shí)間復(fù)雜度O(n)(3)利用棧來(lái)模擬系統(tǒng)運(yùn)行時(shí)的棧漢諾塔非遞歸算法(了解)://Datatype.h#ifndefDatatype_H#defineDatatype_HclassDatatype{public: shortint
no;
//存放一個(gè)標(biāo)識(shí),0表示直接移動(dòng)一個(gè)圓盤(pán)
intndisk; //為1表示需進(jìn)一步分解;
charSPeg;//參數(shù)A charAPeg;//參數(shù)B charDPeg;//參數(shù)C};#endifvoidhanoi2(intn,chara,charb,charc){SeqStack<Datatype>S1;DatatypeH,H1;H.no=1;H.ndisk=n;H.SPeg=a;H.APeg=b;H.DPeg=c;
S1.Push(H);//初始入棧
while(!S1.Empty()){ if(S1.GetTop().no==1&&S1.GetTop().ndisk!=1)
{//退棧hanoi(n,a,b,c);將hanoi(n-1,a,c,b)操作參數(shù)進(jìn)棧
H.ndisk=S1.GetTop().ndisk-1; H.SPeg=S1.GetTop().SPeg; H.APeg=S1.GetTop().APeg; H.DPeg=S1.GetTop().DPeg;
S1.Pop();
H1.no=1; H1.ndisk=H.ndisk; H1.SPeg=H.APeg; H1.APeg=H.SPeg; H1.DPeg=H.DPeg;
S1.Push(H1);
//等價(jià)于move(n,a,c); H1.no=0; H1.ndisk=H.ndisk+1; H1.SPeg=H.SPeg; H1.APeg=H.DPeg;
S1.Push(H1);//等價(jià)于hanoi(n-1,b,a,c)操作參數(shù)進(jìn)棧
H1.no=1; H1.ndisk=H.ndisk; H1.SPeg=H.SPeg; H1.APeg=H.DPeg; H1.DPeg=H.APeg;
S1.Push(H1); }//處理move(n,a,c);輸出及當(dāng)只剩一個(gè)盤(pán)時(shí)的移動(dòng)信息
while((!S1.Empty())&&((S1.GetTop().no==0)||(S1.GetTop().ndisk==1)))
{//將第n個(gè)圓盤(pán)從a移到c退棧if(!S1.Empty()&&(S1.GetTop().no==0)) {
cout<<"將第"<<S1.GetTop().ndisk<<"個(gè)盤(pán)片從"
<<S1.GetTop().SPeg<<"移動(dòng)到"
<<S1.GetTop().APeg<<endl;
S1.Pop(); }
if(!S1.Empty()&&(S1.GetTop().ndisk==1)){//hanoi(1,a,b,c)退棧
cout<<"將第"<<S1.GetTop().ndisk<<"個(gè)盤(pán)片從"
<<S1.GetTop().SPeg<<"移動(dòng)到“
<<S1.GetTop().DPeg<<endl;
S1.Pop();
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級(jí)下冊(cè)《買(mǎi)鮮花》課件版
- 2021屆浙江省寧波市九校高一上學(xué)期期末聯(lián)考數(shù)學(xué)試題(解析版)
- 人教版八年級(jí)上學(xué)期期中考試數(shù)學(xué)試卷-(含答案)
- 《風(fēng)險(xiǎn)投資方法》課件
- 2025年1月八省聯(lián)考高考綜合改革適應(yīng)性測(cè)試-高三化學(xué)(內(nèi)蒙古卷)
- 天津市和平區(qū)2023-2024學(xué)年高三上學(xué)期期末質(zhì)量調(diào)查英語(yǔ)試卷
- 醫(yī)藥行業(yè)前臺(tái)接待工作心得
- 家政服務(wù)保姆照顧技能培訓(xùn)總結(jié)
- 環(huán)保行業(yè)美工工作總結(jié)
- 貴州省安順市紫云縣2021-2022學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題
- 2024至2030年中國(guó)土地整治行業(yè)市場(chǎng)專項(xiàng)調(diào)研及競(jìng)爭(zhēng)戰(zhàn)略分析報(bào)告
- 數(shù)據(jù)交易場(chǎng)所發(fā)展指數(shù)研究報(bào)告(2024年)
- NBT 31021-2012風(fēng)力發(fā)電企業(yè)科技文件規(guī)檔規(guī)范
- 嬰幼兒托育機(jī)構(gòu)安全防護(hù)-整體環(huán)境布局安全隱患識(shí)別與排除策略
- 公安學(xué)基礎(chǔ)智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東警察學(xué)院
- 2024智慧醫(yī)院醫(yī)用耗材SPD供應(yīng)鏈績(jī)效評(píng)價(jià)指南
- DB44-T 2480-2024 鋁及鋁合金深井鑄造安全技術(shù)規(guī)范
- GB/T 15115-2024壓鑄鋁合金
- 中醫(yī)適宜技術(shù)發(fā)展現(xiàn)狀
- 部編人教版四年級(jí)數(shù)學(xué)上冊(cè)期末考試卷(可打印)
- 一例阿爾茨海默病患者的護(hù)理查房
評(píng)論
0/150
提交評(píng)論