




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
本章要點遞歸算法特遞推關系遞歸算法地應用章節(jié)內(nèi)容二.一 遞歸算法 二.一.一遞歸算法特 二.一.二遞歸算法地執(zhí)行過程 二.一.三遞推關系二.二 遞歸法應用舉例二.三 典型問題地C++程序二.四 小結 若一個算法直接地或間接地調(diào)用自己本身,則稱這個算法是遞歸算法。遞歸本質(zhì)上也是一種循環(huán)地算法結構,它把較復雜地計算逐次歸結為較簡單地情形地計算,直到歸結到最簡單情形地計算,并最終得到計算結果為止。 利用遞歸算法解決地問題通常具有如下三個特:(一)求解規(guī)模為n地問題可以轉化為一個或多個結構相同,規(guī)模較小地問題,然后從這些小問題地解能方便地構造出大問題地解。(二)遞歸調(diào)用地次數(shù)需要是有限地。(三)需要有結束遞歸地條件(邊界條件)來終止遞歸。二.一遞歸法二.一.一遞歸算法地特舉例 求階乘問題。如果要求n!,那么這個問題就可以轉化成求n*(n-一)!,而要求(n-一)!又可以轉化成求(n-一)*(n-二)!,有規(guī)律地遞減,直到一!結束。二.一.二遞歸算法地執(zhí)行過程 遞歸算法地執(zhí)行過程劃分為遞推與回歸兩個階段。在遞推階段,把規(guī)模為n地問題地求解推到比原問題地規(guī)模較小地問題求解,且需要要有終止遞歸地條件。在回歸階段,當獲得最簡單情況地解后,逐級返回,依次得到規(guī)模較大問題地解。舉例 求當n=一時,f(一)=二一=二可以作為遞歸出口。當n>一時,f(n)可以分解為f(n)=二n=二*二n-一=二*f(n-一)。因此原問題f(n)地求解可以轉化為求解規(guī)模更小地子問題f(n-一),f(n-一)與f(n)具有同一問題類型。該問題可以用如下遞歸方程來表示:遞歸算法地計算過程是由復雜到簡單再到復雜。二.一.三遞推關系遞推關系常用來分析遞歸算法地時間與空間代價。遞推方程是自然數(shù)上地一個函數(shù)T(n),它使用一個或多個小于n時地值地等式或不等式來描述。遞推方程也稱為遞推關系或遞推式。算法運行時間復雜度主要由關于問題規(guī)模地高階項決定,注意遞推方程需要有一個初始條件(也稱邊界條件)。
計算遞推式通常有三種方法:替換方法,迭代方法與公式法。一替換方法替換方法要求首先猜測遞推式地解,然后用歸納法證明。例二.二需要注意在上述證明過程,沒有考慮初始條件,而初始條件是歸納法成立地基礎。上例歸納證明地初始條件是是T(一)≤c,只要選擇足夠大地c≥一即成立。二.迭代方法迭代方法地思想是擴展遞推式,將遞推式先轉換成一個與式,然后計算該與式,得到漸近復雜度。例二.四使用迭代方法分析使用遞歸樹可以形象地看到遞推式地迭代過程。例二-五T(n)=T(n/三)+T(二n/三)+n地遞歸樹三.公式法(或主方法)對于一般形式地遞歸方程,可以使用公式法,更加方便快捷地得到遞歸方程地解。在遞歸算法分析,常需要求解如下形式地遞推式:T(n)=aT(n/b)+f(n) 式,a≥一與b>一是常數(shù),f(n)是一個漸近正函數(shù),n/b指n/b或n/b。求解這類遞推式地方法稱為公式法。定理設a≥一與b>一為常數(shù),f(n)是一個函數(shù),T(n)由下面地遞推式定義T(n)=aT(n/b)+f(n)式,n/b指n/b或n/b,則T(n)有如下地漸近界:(一)若對某常數(shù)>零,有,則(二)若,則;(三)若對某常數(shù)>零,有,且對某個常數(shù)c<一與所有足夠大地n,有af(n/b)≤cf(n),則T(n)=(f(n))。大小為n地原問題分成若干個大小為n/b地子問題,其a個子問題需要求解,而k是合并各個子問題地解需要地工作量。?íì>+==一)(一)(nbnaTncnTk???íì<=>=kkkbkkabanObannObanOnTb)()log()()(log但是并非所有地遞推式都可以用公式法求解。例T(n)=二T(n/二)+nlogn 由于a=二,b=二,f(n)=nlogn與nlogba=n??雌饋硭坪鯇儆谥鞫ɡ砬闆r(三),但事實上f(n)只是漸近大于n,但并不是多項式大于n。f(n)與地nlogba比值是logn,對于任何正數(shù),logn漸近小于n,所以,此例不能運用定理。二.二遞歸法應用舉例二.二.一漢諾塔問題一,問題描述 漢諾塔(TowerofHanoi)問題是源于印度一個古老傳說。印度教地主神大梵天創(chuàng)造世界地時候,在印度北部佛教圣地貝拿勒斯神廟里,安放了一塊黃銅板,板上插著三根金剛石柱子,在其一根柱子上從下往上按照大小順序摞著六四片黃金圓盤。漢諾塔示意圖見圖二-三所示。大梵天命令婆羅門按照以下規(guī)則把圓盤按大小順序重新擺放在另一根柱子上:在三根柱子之間一次只能移動一個圓盤。移動地時候始終只能小圓盤壓著大圓盤。盤子只能在三個柱子上存放。二,遞歸算法地思想 假設有n個金盤,三根相鄰地柱子標號為A,B,C,并且A柱上金盤由小到大依次編號為一,二,…,n。現(xiàn)要把按金字塔狀疊放著n個不同大小地圓盤,一個一個移動到柱子C上。當只有一個盤子時,即n=一,則只需經(jīng)過一次移動將盤子從A柱到C柱;當n>一時可以把最上面n-一個金盤看作是一個整體。這樣n個金盤就分成了兩部分:上面n-一個金盤與最下面地一個金盤。移動金盤地問題就轉換為以下步驟來執(zhí)行:借助C柱,將n-一個金盤從A柱上移動到B柱上。將編號為n地金盤直接從A柱移動到C柱上。借助A柱,將n-一個金盤從B柱移動到C柱上。 其第二步只移動一個金盤,第一步與第三步雖然不能直接解決,但把移動n個金盤地問題變成了移動n-一個金盤地問題,使問題地規(guī)模變小了。以此類推,從而將整個問題得以解決。因此漢諾塔問題是一個典型地遞歸問題。三,遞歸算法描述漢諾塔問題地遞歸算法用偽代碼描述如下。遞歸函數(shù)Hannoi用偽代碼描述如下:輸入圓盤總數(shù)即問題規(guī)模n;輸出移動地次數(shù)(一)如果問題規(guī)模n=一,將盤子從A柱直接移動到C柱,則算法結束;(二)當問題規(guī)模n>一時,需先將A柱上地n-一個盤子借助C柱移到B柱上;(三)再將A柱上地第n個盤子移動到C柱;(四)然后將B柱上地n-一個盤子借助A柱移到C柱上;(五)完成A柱到C柱地移動;四,遞歸算法分析
下面給出三個金盤地執(zhí)行過程。二.二.二斐波那契數(shù)列問題一,問題描述 著名地數(shù)列—斐波那契數(shù)列(Fibonacci),可以定義為:二,遞歸算法思想 根據(jù)這個定義可以得到無窮數(shù)列:零,一,一,二,三,五,八,一三,二一,三四,五五……,顯然,為求解第n個斐波那契數(shù),需要先計算F(n-一)與F(n-二),而計算F(n-一)與F(n-二)又需要先計算F(n-三)與F(n-四),以此類推,直至F(零)與F(一),而F(零)與F(一)是可以立即求得,因此該問題可以利用遞歸方法求解。三,遞歸算法描述斐波那契數(shù)列地遞歸算法用偽代碼描述如下:輸入斐波那契數(shù)n輸出第n項斐波那契數(shù),以及前n項斐波那契數(shù)列地與。遞歸函數(shù)fib用偽代碼描述如下:(一)如果n≤二,則返回一;(二)當n≥二時,返回第n項斐波那契數(shù)F(n-一)+F(n-二);(三)計算前n項斐波那契數(shù)列地與。四,遞歸算法分析
令T(n)為斐波那契數(shù)列地運行時間,當n≥二時,分析可知T(n)=T(n-一)+T(n-二)+二,由歸納法證明可得:T(n)=O(二n),說明計算是以指數(shù)增長地,基本上是最壞情形。二.二.三八皇后問題
一,問題描述 八皇后問題是一個古老而著名地問題,它由數(shù)學家高斯于一八五零年提出,問題地主要思想是:在八×八格地際象棋棋盤上放置八個皇后,使得任意兩個皇后不能互相,即任何行,列或?qū)蔷€上不得有兩個或兩個以上地皇后。這樣地一個格局稱為問題地一個解。二,遞歸算法思想 考慮到皇后地特,可以為限定所有地皇后不同行,不同列及不在同一條斜線上,擺放地基本步驟是:將第一個棋子從第一行開始,按照列從小到大地順序選擇擺放地位置;接下來從第二行按照可行地方案,從小到大地順序擺放第二個棋子;在第一與第二個棋子固定地情況下,再選擇可行地位置在第三行上擺放第三個棋子,以此類推。每一步地執(zhí)行將使問題變成更小規(guī)模地問題而向下遞歸。在(i,j)位置上放置皇后地可行條件為:三,遞歸算法描述八皇后問題地遞歸算法用偽代碼描述如下:輸入八皇后輸出八皇后問題地擺放方案遞歸check函數(shù)用偽代碼描述如下:(一)數(shù)組C,R,L分別用來標記沖突,數(shù)組C代表列沖突,如果某列上已經(jīng)有皇后,則為false,否則為true;數(shù)組R代表右上至左下地對角線沖突,如果某行上已經(jīng)有皇后,則為false,否則為true;L數(shù)組代表左上至右下地對角線沖突,如果某行上已經(jīng)有皇后,則為false,否則為true;(二)選擇在第i行第j列(i,j)位置擺放皇后地可行條件是:nQueen=C[j]&&R[i+j]&&L[i-j+九](三)當nQueen為true時,就可將皇后擺放在(i,j)位置;(四)修改可行標志,包括所在列與兩個對角線,判斷是否放完八個皇后;(五)如果沒有放完八個皇后,則繼續(xù)放下一個,這時遞歸調(diào)用check(i+一);(六)如果放完八個皇后,給出該放置方案;(七)修改可行標志,將數(shù)組C,R,L都設置為true,準備下一個放置方案;四,遞歸算法分析
八皇后問題地遞歸算法執(zhí)行時間與全排列地時間類似,是循環(huán)加遞歸,該算法地運行時間與皇后放置方法有關,故其時間復雜度為O(n三)。二.三典型問題地C++程序一.漢諾塔問題voidmove(intn,charx,chary){ cout<<"把"<<n<<"號從"<<x<<"挪動到"<<y<<endl;}voidHannoi(intn,charA,charB,charC) { if(n==一) //遞歸終止條件 move(一,A,C); else {Hannoi(n-一,A,C,B); //遞歸調(diào)用 move(n,A,C); Hannoi(n-一,B,A,C); //遞歸調(diào)用 }}二.斐波那契數(shù)列l(wèi)ongFib(longn){ if(n<=一)returnn; elsereturnFib(n-二)+Fib(n-一);} Fib函數(shù)執(zhí)行時地調(diào)用關系如下三.八皇后問題voidcheck(inti) //被調(diào)用函數(shù){ intj; //循環(huán)變量,表示列號 intk; //臨時變量 for(j=一;j<=八;j++) { if((C[j]==true)&&(R[i+j]==true)&&(L[i-j+Normalize]==true))//表示第i行第j列可行 {Queen[i]=j; //占用位置(i,j) C[j]=false; //修改可行標志,包括所在列與兩個對角線 L[i-j+Normalize]=false; R[i+j]=false;if(i<八) //判斷是否放完八個皇后 { check(i+一);//未放完則繼續(xù)放下一個 }else //已經(jīng)放完八個皇后 { Num++; //方案數(shù)加一 cout<<"方案"<<Num<<":"<<"\t";//輸出方案號 for(k=一;k<=八;k++) cout<<k<<"行"<<Queen[k]<<"列"<<"\t";//輸出 cout<<endl;//換行 } C[j]=true; //修改
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關于教師期末工作總結范文(28篇)
- 幼兒園衛(wèi)生保健秋季工作計劃(33篇)
- 2025年體育部工作計劃
- DBT29-276-2020 城市綜合管廊監(jiān)控與報警系統(tǒng)安裝工程施工規(guī)范
- 中國非插電式混合動力轎車及越野車市場前景預測及投資規(guī)劃研究報告
- 中國平臺軟件市場評估分析及發(fā)展前景調(diào)研戰(zhàn)略研究報告
- 2025年中國丙位辛內(nèi)酯市場運營態(tài)勢分析及投資前景預測報告
- 混齡班保育工作總結
- 2025年塑料裝飾燈項目可行性研究報告
- 2024-2025學年高中政治專題32凱恩斯革命教案新人教版選修2
- 高二數(shù)學(含創(chuàng)意快閃特效)-【開學第一課】2023年高中秋季開學指南之愛上數(shù)學課
- 《學前兒童社會教育》學前兒童社會教育概述-pp課件
- 全國醫(yī)學英語統(tǒng)考醫(yī)學英語詞匯表
- 【品牌建設研究國內(nèi)外文獻綜述5000字】
- 國家電網(wǎng)公司電力安全工作規(guī)程(電力通信部分)(試行)
- 第八版-精神分裂癥及其他精神病性障礙(中文)
- 小學一年級新生報名登記表
- 生態(tài)毒理學第三章毒物的分子效應與毒理學機制
- 智能財務共享在京東的應用研究
- 衛(wèi)生和微生物基礎知識培訓-
- 2023年鎮(zhèn)江市高等??茖W校單招綜合素質(zhì)題庫及答案解析
評論
0/150
提交評論