遞歸與非遞歸程序的轉(zhuǎn)換_第1頁
遞歸與非遞歸程序的轉(zhuǎn)換_第2頁
遞歸與非遞歸程序的轉(zhuǎn)換_第3頁
遞歸與非遞歸程序的轉(zhuǎn)換_第4頁
遞歸與非遞歸程序的轉(zhuǎn)換_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

遞歸程序非遞歸程序張仕shi@0遞歸的基本概念遞歸:在定義一個過程或函數(shù)時,如果出現(xiàn)調(diào)用本過程或本函數(shù)的成分,則稱為遞歸。直接遞歸:在定義一個過程或函數(shù)時,出現(xiàn)直接調(diào)用本過程或本函數(shù)成分的情況。直接遞歸:在定義一個過程或函數(shù)時,出現(xiàn)間接調(diào)用本過程或本函數(shù)成分的情況。0遞歸的基本概念function_1(X){if(X)X*function_1(X-1);elsereturn;}Function_1、function_2實現(xiàn)了什么功能?還有哪些常見的遞歸函數(shù)?function_2(X){if(X)function_3(X);elsereturn;}function_3(X){returnX*function_2(X-1);}0遞歸的基本概念在什么情況下用到遞歸方法給出的定義是遞歸的:許多數(shù)學(xué)公式、數(shù)列的定義是遞歸的,這是可以直接把遞歸定義轉(zhuǎn)換為遞歸算法:例如Fabonacci數(shù)列。數(shù)據(jù)結(jié)構(gòu)是遞歸的:常見的有樹、鏈表等數(shù)據(jù)結(jié)構(gòu)的定義。對于這類數(shù)據(jù)結(jié)構(gòu),常采用遞歸的方法進(jìn)行操作。例如鏈表的遍歷、樹的遍歷操作。問題求解的方法是遞歸的。例如漢諾塔問題,其求解方法是遞歸的。1遞歸算法的設(shè)計遞歸模型:遞歸模型是遞歸算法的抽象,它反映遞歸問題的遞歸結(jié)構(gòu),例如,前面的遞歸算法對應(yīng)的遞歸模型如下: fun(0)=1 n=0 (1) fun(n)=n*fun(n-1) n>0 (2)其中:第一個式子給出了遞歸的終止條件,我們稱之為遞歸出口;第二個式子給出了fun(n)的值與fun(n-1)的值之間的關(guān)系,我們稱之為遞歸體。1遞歸算法的設(shè)計一般地,一個遞歸模型是由遞歸出口和遞歸體兩部分組成,前者確定遞歸到何時結(jié)束,后者確定遞歸求解時的遞推關(guān)系。遞歸出口的一般格式如下:f(s1)=m1 這里的s1與m1均為常量,有些遞歸問題可能有幾個遞歸出口。1遞歸算法的設(shè)計遞歸體的一般格式如下:f(sn+1)=g(f(si),f(si+1),…,f(sn),cj,cj+1,…,cm)其中,n,i,j,m均為正整數(shù)。sn+1是一個遞歸“大問題”,si,si+1,…,sn為遞歸“小問題”,cj,cj+1,…,cm是可以用非遞歸方法直接解決的問題g是一個非遞歸函數(shù),可以直接求值。1遞歸算法的設(shè)計遞歸思路實際上,遞歸思路是把一個不能或不好直接求解的“大問題”轉(zhuǎn)化成一個或幾個“小問題”來解決,再把這些“小問題”進(jìn)一步分解成更小的“小問題”來解決,如此分解,直至每個“小問題”都可以直接解決(此時分解到遞歸出口)。但遞歸分解不是隨意的分解,遞歸分解要保證“大問題”與“小問題”相似,即求解過程與環(huán)境都相似。并且有一個分解的終點(diǎn)。從而使問題可解。1遞歸算法的設(shè)計逐步分解和組合求值的過程1遞歸算法的設(shè)計斐波那契數(shù):一個大問題分解為多個小問題的過程1遞歸算法的設(shè)計算法設(shè)計:先將整個問題劃分為若干個子問題,通過分別求解子問題,最后獲得整個問題的解。而這些子問題具有與原問題相同的求解方法,于是可以再將它們劃分成若干個子問題,分別求解,如此反復(fù)進(jìn)行,直到不能再劃分成子問題,或已經(jīng)可以求解為止。這種自上而下將問題分解、求解,再自上而下引用、合并,求出最后解答的過程稱為遞歸求解過程。這是一種分而治之的算法設(shè)計方法。1遞歸算法的設(shè)計遞歸設(shè)計的步驟如下:(1)對原問題f(s)進(jìn)行分析,假設(shè)出合理的“較小問題”f(s')(與數(shù)學(xué)歸納法中假設(shè)n=k-1時等式成立相似);(2)假設(shè)f(s')是可解的,在此基礎(chǔ)上確定f(s)的解,即給出f(s)與f(s')之間的關(guān)系(與數(shù)學(xué)歸納法中求證n=k時等式成立的過程相似);(3)確定一個特定情況(如f(1)或f(0))的解,由此作為遞歸出口(與數(shù)學(xué)歸納法中求證n=1時等式成立相似)。1遞歸算法的設(shè)計課堂練習(xí):采用遞歸算法求實數(shù)數(shù)組A[0..n-1]中的最小值。基本步驟:先定義清楚問題;寫出遞歸模型;轉(zhuǎn)換為算法。2為什么:遞歸非遞歸?引例求如下函數(shù)值Sum(1..X)=X+Sum(1..X-1)X>0Sum(1..X)=0X<=0它的程序?2為什么:遞歸非遞歸?利用遞歸求該函數(shù)#include"stdafx.h"#include<iostream>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){ cout<<add(5000); return0;}intadd(intx){ if(x<=0)return0; returnx+add(x-1);}2為什層么:芳遞歸非遞叼歸?利用湖非遞妥歸(迭代)求該顛函數(shù)#i就nc殺lu詠de榆"遞st價da掘fx濾.h陵"#i四nc揀lu拳de撫<欺io垮st叉re擁am皇>us谷in姻g淋na若me破sp鄭ac慚e蚊st檔d;in困t殲_t賭ma路in盟(i軌nt瓦a驚rg越c,敢_涼TC抹HA丸R*潔a椒rg兵v[啟]){co其ut返<<su輸m(5區(qū)00肅0)蟻;re飛tu寨rn竟0腸;}in掃t從su鉗m(籠in持t盛x){in降t奸re樣su烤lt乒=0業(yè);fo漏r(旱in辮t及i=姓x;厲i乳>0相;誦i-撤-)re夜su棋lt鞋+=礦x;re石tu枕rn死r錘es肥ul律t;}2為什修么:歡遞歸非遞讀歸?它們越的運(yùn)諷行結(jié)喜果?遞歸餃迭撤代X=叔10X=頁10怪0X=揉10拖00X=霜10翠00計0X=吸10沖00寨00…燦…為什欲么?2為什誕么:晌遞歸非遞屠歸?利用販遞歸用求該旦函數(shù)#i遭nc罰lu狠de臂"強(qiáng)st怎da漢fx夾.h闖"#i油nc記lu漫de頓<亞io椒st同re釋am草>us慶in耽g妨na點(diǎn)me承sp鵲ac就e梯st尤d;in腹t叔_t村ma容in畝(i句nt棉a潛rg呀c,曲_逃TC瓶HA雄R*黎a耕rg僚v[浩]){co香ut議<<ad板d(絕50民00樹);re殘tu辯rn豪0較;}in患t敏ad氏d(規(guī)in醫(yī)t飾x){ch塌ar航a衰[1完00掃0]眼;if幻玉(x稈<=圈0)換r小et精ur提n厚0;re研tu黃rn夾x麻+a壯dd很(x香-1償);}2為什仁么:滔遞歸非遞您歸?遞歸斷的原忽理?為什龜么要設(shè)使用芒非遞端歸?賀(內(nèi)幫存、編效率揭)遞歸萬和非贏遞歸宰的優(yōu)光缺點(diǎn)疏?什么罩時候嚼使用煤遞歸態(tài)?3遞歸非遞孕歸的博轉(zhuǎn)換把遞成歸算傘法轉(zhuǎn)現(xiàn)化為估非遞皂歸算請法有赤如下抹三種匆基本贏方法杏:(1臂)自己夏用??蚰M菠系統(tǒng)秀的運(yùn)刃行時落棧,示通過克分析供只保捧存必鴨須保我存的鵲信息黨,從鳳而用忘非遞京歸算唇法替旱代遞害歸算救法。(2涉)利用沾棧保倘存參污數(shù),循由于苗棧的而后進(jìn)蹤蝶先出帶特性禮吻合刊遞歸革算法不的執(zhí)間行過質(zhì)程,雙因而仔可以去用非牧遞歸渠算法斷替代土遞歸脊算法給。(3超)通過夏分析隊,跳秘過分厲解過您程,誰直接搭用循網(wǎng)環(huán)結(jié)機(jī)構(gòu)的詞算法牧實現(xiàn)賭求值恭過程團(tuán)。3遞歸非遞乎歸的礎(chǔ)轉(zhuǎn)換波方法1-表述1求解過程3遞歸非遞押歸的替轉(zhuǎn)換灣方法1-表述1自定貓義堆映棧法飲:采旬用自邀定義羨堆棧拿替代幅系統(tǒng)鴉堆棧確的方飛式實窯現(xiàn)遞便歸函努數(shù)的橫轉(zhuǎn)換除。目的烤:為員不能膠分析斃出來土循環(huán)則的遞憲歸操襲作提傭供開不銷可尖控的研方法缸。適用巷性:疏所有勤的遞港歸函帝數(shù)。如何鄰實現(xiàn)談?3遞歸非遞股歸的摧轉(zhuǎn)換熄方法1-表述1基本原思想的(詳濫細(xì)見2-洪1-儉1.見cp赴p):遞歸兇中函疤數(shù)的團(tuán)每一文層都攻兩次或到達(dá)榆,一煙次是張繼續(xù)侵往下棉一層遮遞歸愉,另呢外下滋一層科的遞預(yù)歸出混來后帽。兩可次要激做的詢工作壩是不悲一樣需的。1進(jìn)入駁某一裙程序衰時,堵需要嫌做一拆些預(yù)防備工交作;2進(jìn)行覆遞歸招調(diào)用要,進(jìn)約入下素一層醋;3下一悼層返止回,墻利用由返回民結(jié)果秀組合剩出新迷的結(jié)床果。3遞歸非遞尾歸的皺轉(zhuǎn)換夸方法1-表述1練習(xí)稿:1求N!的丟遞歸胖算法嘗;2求N!的劫棧模蛾擬遞贈歸算孕法;3求斐蝦波那壤契數(shù)挖的遞塘歸算貍法;4求斐搖波那仇契數(shù)劍的棧市模擬暮遞歸賓算法套。其中煉,斐私波那勾契數(shù)羨(Fo咐ba示na蘿cc糧i)定檔義如蝴下:f(價1)關(guān)=1f(膠2)內(nèi)=1f(冰n)慈=f梯(n采-1投)+然f(巧n-飼2)蓬,其中n>襲=2討論袖直接閃使用災(zāi)棧保博存中泉間結(jié)樸果,楚從而梳將遞含歸算刻法轉(zhuǎn)晶化為創(chuàng)非遞剛歸算義法的獨(dú)過程倆。以求N!為例,其遞曉歸模宏型有垃一個趴遞歸夕體和去一個報遞歸償出口普兩個舌式子,分別湯稱為(1根)式和(2箭)式。3遞歸非遞通歸的轉(zhuǎn)換方法1-表述2設(shè)計北一個聯(lián)棧,其結(jié)興構(gòu)如齊下:st雪ru溉ct{幟in屠tvn;鋪/*保存n值*/in京tvf;朋/*保存fu笛n1既(n榴)值*/in異tta成g;糊/*標(biāo)識伯是否地求出fu吸n1局(n錄)值,1:未求米出,0弟:已求鋪出*/}St恐[M喬ax醉Si吼ze];翻/*定義棕簡單賺數(shù)組槽棧*/3遞歸非遞酒歸的轉(zhuǎn)換方法1-表述2計算fu俘n1注(5極)之值孕的過刷程如勞下:將(5翁,*套,1佛)進(jìn)棧;wh糾il因e架(棧不延空){俘i齊f滋(未計屯算出城棧頂瞧元素首的vf值即St標(biāo)[t夾op別].懂ta禾g=固=1窗)if松(棧頂統(tǒng)元素攪滿足(1丘)式)求出憐對應(yīng)喝的St肆[t竄op茅].圍vf值,置St外[t橫op皆].委ta芬g=概0;el晚se筆/*棧頂墨元素諸滿足(2包)式*/將(S繁t[誼to饅p]鞏.v王n-攻1,柔*,撤1)進(jìn)棧;el如se披i士f替(已計律算出察棧頂裙元素?fù)岬膙f值即St矩[t慰op勸].寶ta柄g=大=0鮮)顯然賭棧頂鎮(zhèn)元素蠟由次眾棧頂忠元素錯通過(2鍋)式分梳解得尾到的肌,回豬過來由棧詳頂元伍素的vf值計門算出閥次棧集頂元眨素的vf值并丈退棧;if邊(棧中搜只有曬一個懼已求鏈出vf值的罵元素)退出顏循環(huán);}St英[0奪].榜vf即為挑所求蠻的fu銷n1耐(n攤)值;3遞歸非遞跳歸的測轉(zhuǎn)換煩方法1-表述23遞歸非遞吩歸的濤轉(zhuǎn)換振方法1-表述2對應(yīng)狀的非嶺遞歸fu地n1算法歸如下榮:in沈t敘fu之n1尿(i請nt脖n閉){混to航p+雪+;頂/野*初值憐進(jìn)棧鴿*/St淚[t昨op個].犁vn=n榆;若St瞞[t晉op森].手ta案g=鉆1;wh結(jié)il燙e碼(t大op譯>-給1)馳/*棧不辯空時脾循環(huán)貿(mào)*/{始i禽f己(S賤t[例to步p]匪.t刮ag疾==喉1)揭/*未計眼算出善棧頂充元素緣瑞的vf值*/{訓(xùn)if院(St舅[t床op飽].井vn==麻0)緊/界*(丈1)式*/{St臺[t裹op傍].佛vf=1書;St超[t哀op隙].顏ta百g=元0;}el乓se判/乞*(肉2)式*/{窯t耽op槍++態(tài);St歇[t熄op蹦].只vn=S騙t[吐to梳p-立1]己.v袋n-它1;狂S悅t[才to博p]胖.t詳ag春=1吩;}}3遞歸非遞館歸的冊轉(zhuǎn)換禍方法1-表述2el尺se液i估f擋(S綱t[噴to杜p]朱.t他ag搶==鼓0)瓜/*已計既算出vf值*/{設(shè)S瓜t[箭to鹽p-悔1]午.v攜f=蒼St突[t嘴op火-1可].剩vn致*St泄[t默op敵].磚vf;拌/核*(鬧2)式*/St屯[t羽op鼻-1設(shè)].暈ta填g=次0;to拖p-眨-;}/*棧中踏只有危一個情已求績出vf的元芹素時平退出媽循環(huán)帆*/if飄(章to鑰p=嗽=0渣&擴(kuò)&拖St裁[t據(jù)op政].貧ta榆g=晃=0朱)br粘ea棕k;}re殺tu腦rn悼(S確t[躁to比p]天.v吸f);}3遞歸非遞跑歸的簽轉(zhuǎn)換纏方法1-表述2練習(xí)以N=仿5為例慰,完趙整的立在紙講上模五擬整旦個算敲法的限運(yùn)算址過程阻,以駱此加夢深對剖表述2的理槐解。以表奸述2方法班,求分斐波刑那契筐數(shù)的綢棧模遙擬遞撕歸算舞法。其中箱,斐灘波那財契數(shù)念(Fo春ba賽na先cc艘i)定中義如嘴下:f(捧1)宵=1f(幻玉2)險=1f(藏n)河=f適(n皺-1瞞)+樹f(刷n-退2)仔,其中n>惕=23遞歸非遞椅歸的溫轉(zhuǎn)換冠方法2利用需棧保撐存參產(chǎn)數(shù):跑該方盛法通判常以托棧為漿保存著運(yùn)行喜中間昆數(shù)據(jù)司的媒央介。例:灣二叉浮樹的淹中序抄遍歷數(shù)。DF衣S(脈T寧)DF暫S(溝T-否>lc換hi計ld);Vi愧si花t(壁T仔)叢;DF礙S(問T-爆>rc軍hi兩ld);3遞歸非遞勝歸的妥轉(zhuǎn)換睬方法2St繪at構(gòu)usIn閥Or炮de渾r(寺Bi喬Tr史eero忽ot持,St肌at尾us泛(*Vi蝴si局t)抵(E柜le娛mT維yp蔽ee))/*中序姥遍歷村二叉螞樹,咳r刻oo挑t指向業(yè)二叉旁樹(或某浸一子按樹)盼*/{喬if渴(島ro曬ot否!咸=N旬UL議L){喪i鏟f(In尖Or懲de負(fù)r(壩ro落ot->LC烤hi翠ld,產(chǎn)vi馳si屯t)胡)劉/顏*遍歷說左子禁樹*/if錦(V旅is躁it跑(r毒oo綿t->揭da極ta澤))曠/提*訪問止根結(jié)腐點(diǎn)*/if稈(I發(fā)nO新rd辰er零(r靠oo扎t->RC炮hi派ld,撈vi域si氣t))植/磨*遍歷薪右子啄樹*/re拳tu旺rn騾O潔K;re幕tu妻r(nóng)n云E長rr瓣or翼;}e脊ls蹄e燈re常tu凈rn喂O棚K;}3遞歸非遞憲歸的街轉(zhuǎn)換兇方法2利用恩棧來板模擬遣整個齡遍歷稍過程火,再負(fù)根據(jù)姓遍歷葬寫出糖算法妹。3遞歸非遞乖歸的沃轉(zhuǎn)換六方法2vo搞idIn超Or借de沈r(Bi外Tr軍eero庸ot)/*中序劍遍歷顏二叉著樹的匙非遞交歸算進(jìn)法臥*/{In彈it杠St備ac查k(S擱);瞎p漏=r狡oo怕t;wh恭il餅e(堡p!汪=N筍UL嫂L澆||車!Is節(jié)Em微pt貿(mào)y(釋S)){鑒i讓f陣(p舞!沾=N異UL崗L)煤/*根指濟(jì)針進(jìn)奏棧,禮遍籍歷左牌子樹倒*/{Pu箏sh算(S,現(xiàn)p)止;烏p=屋p-諸>LC訪hi撈ld;少}el練se究/攏*根指霧針退訊棧,字訪早問根漢結(jié)點(diǎn)娛,拍遍歷熟右子廚樹*/{Po恒p(脂S,遺p)屈;梨V稱is奧it濾(p備->甲da建ta話);串p轎=p助->RC蘆hi東ld;終}}/銜/e來nd駐o今f眨wh久il栽e}3遞歸非遞包歸的牲轉(zhuǎn)換騙方法3利用艙迭代浙消除巨遞歸跳:通卸過分屆析,和跳過些分解亦過程戒,直匙接用鹽循環(huán)鮮結(jié)構(gòu)檢的算宮法實蟲現(xiàn)求前值過欣程。斐波進(jìn)那契性數(shù)(Fo香ba破na果cc蔑i)定戰(zhàn)義如柏下:f(犯1)騙=1f(骨2)緊=1f(損n)禽=f茂(n職-1途)+損f(贈n-味2)錫,其中n>傲=2從中親找出振循環(huán)鐵求值啊。3遞歸非遞貢歸的雁轉(zhuǎn)換蟻方法3求解Fi可bo鄙na推cc扒i數(shù)列渴的算垃法如龜下:in蹈tFi削b(擦in區(qū)tn){in顆ti,漿f1刺,f賀2,忘f3菌;if魔(說n=招=1矩|看|顯n=逮=2調(diào))re脖tu抽rn庭(n);f1曉=1懸;f曾2=敬2;fo意r唇(i其=3概;i斗<=n;坡i++哥){侵f霉3=胃f1罵+f本2;f1吹=f剪2;古f2坐=f寸3;}re循tu駁

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論