算法與結構課件第二章遞歸(華北電力大學科技學院).ppt
《算法與結構課件第二章遞歸(華北電力大學科技學院).ppt》由會員分享,可在線閱讀,更多相關《算法與結構課件第二章遞歸(華北電力大學科技學院).ppt(58頁珍藏版)》請在裝配圖網(wǎng)上搜索。
計算機算法設計與分析,NorthChinaElectricPowerUniversity,ComputerAlgorithmsDesignreturnn*Factorial(n-1);},2遞歸算法的應用和實現(xiàn),如果問題的數(shù)據(jù)結構是遞歸的,問題的定義是遞歸的,問題的解法是遞歸的,可以考慮用遞歸算法。,看下面的數(shù)據(jù)結構:,,,,,Head,^,…,,,,Head,,,這是單鏈表,每個結點有兩個域:數(shù)據(jù)域和指針域。它是一種遞歸的結構,可定義為:1)一個結點,其指針域為null,是一個單鏈表;2)一個結點,其指針域為有效指針指向一個單鏈表,仍是一個單鏈表。,1)問題的數(shù)據(jù)結構是遞歸的,NorthChinaElectricPowerUniversity,若存在如上定義的一個單鏈表,現(xiàn)要實現(xiàn)打印最后一個結點的數(shù)據(jù)域的值,可用下面遞歸過程:,templateclasslink_list{Typedata;link_list*next;};templatevoidsearch1(link_list*h){if(h->next==null)coutdata;elsesearch1(h->next);},NorthChinaElectricPowerUniversity,NorthChinaElectricPowerUniversity,二叉樹(BinaryTree)也是一種遞歸的數(shù)據(jù)結構,其遞歸定義為:1)它是一棵空樹;2)它是由一個根結點和兩棵分別稱為左右子樹的二叉樹構成。,要遍歷一棵二叉樹可以采用下面的遞歸算法:,voidTraverse(Bitptr*t){if(t!=null){coutdata;Traverse(t->lchild);Traverse(t->rchild);}},NorthChinaElectricPowerUniversity,例:Fibonacci數(shù)列無窮數(shù)列1,1,2,3,5,8,13,21,34,55,…,稱為Fibonacci數(shù)列。它可以遞歸地定義為:,Fib(n)=,,1n=0,1n=1,Fib(n-1)+Fib(n-2)n>1,第n個Fibonacci數(shù)可遞歸地計算如下:intFibonacci(intn){if(nm>1;正整數(shù)n的最大加數(shù)n1不大于m的劃分由n1=m的劃分和n1≤m-1的劃分組成。以上的關系實際上給出了計算q(n,m)的遞歸式如下:,q(n,m)=,,1m=1,q(n,n)nm>1,0n<1或m<1,遞歸算法的設計方法,,遞歸算法既是一種有效的算法設計方法,也是一種有效的分析問題的方法。遞歸算法求解問題的基本思想是:對于一個較為復雜的問題,把原問題分解成若干個相對簡單且類同的子問題,這樣,原問題就可遞推得到解。適宜于用遞歸算法求解的問題的充分必要條件是:(1)問題具有某種可借用的類同自身的子問題描述的性質(zhì);(2)某一有限步的子問題(也稱作本原問題)有直接的解存在。當一個問題存在上述兩個基本要素時,該問題的遞歸算法的設計方法是:(1)把對原問題的求解設計成包含有對子問題求解的形式。(2)設計遞歸出口。,,例設計模擬漢諾塔問題求解過程的算法。漢諾塔問題的描述是:設有3根標號為A,B,C的柱子,在A柱上放著n個盤子,每一個都比下面的略小一點,要求把A柱上的盤子全部移到C柱上,移動的規(guī)則是:(1)一次只能移動一個盤子;(2)移動過程中大盤子不能放在小盤子上面;(3)在移動過程中盤子可以放在A,B,C的任意一個柱子上。,問題分析:可以用遞歸方法求解n個盤子的漢諾塔問題。,,基本思想:1個盤子的漢諾塔問題可直接移動。n個盤子的漢諾塔問題可遞歸表示為,首先把上邊的n-1個盤子從A柱移到B柱,然后把最下邊的一個盤子從A柱移到C柱,最后把移到B柱的n-1個盤子再移到C柱。4個盤子漢諾塔問題的遞歸求解示意圖如圖6-4所示。,,圖6-4漢諾塔問題的遞歸求解示意圖,,,,,,,,,,,,,,,,,,,,,,,,,,Y,X,Z,以三個盤為例:,A,B,C,,算法設計:首先,盤子的個數(shù)n是必須的一個輸入?yún)?shù),對n個盤子,我們可從上至下依次編號為1,2,…,n;其次,輸入?yún)?shù)還需有3個柱子的代號,我們令3個柱子的參數(shù)名分別為fromPeg,auxPeg和toPeg;最后,漢諾塔問題的求解是一個處理過程,因此算法的輸出是n個盤子從柱子fromPeg借助柱子auxPeg移動到柱子toPeg的移動步驟,我們設計每一步的移動為屏幕顯示如下形式的信息:MoveDiskifromPegXtoPegY這樣,漢諾塔問題的遞歸算法可設計如下:,voidtowers(intn,charfromPeg,chartoPeg,charauxPeg){if(n==1)//遞歸出口{printf("%s%c%s%c\n","movedisk1frompeg",fromPeg,"topeg",toPeg);return;}//把n-1個圓盤從fromPeg借助toPeg移至auxPegtowers(n-1,fromPeg,auxPeg,toPeg);//把圓盤n由fromPeg直接移至toPegprintf("%s%d%s%c%s%c\n","movedisk",n,"frompeg",fromPeg,"topeg",toPeg);//把n-1個圓盤從auxPeg借助fromPeg移至toPegtowers(n-1,auxPeg,toPeg,fromPeg);},測試主函數(shù)如下:#includevoidmain(void){Towers(4,A,C,B);}程序運行的輸出信息如下:,MoveDisk1fromPegAtoPegBMoveDisk2fromPegAtoPegCMoveDisk1fromPegBtoPegCMoveDisk3fromPegAtoPegBMoveDisk1fromPegCtoPegAMoveDisk2fromPegCtoPegBMoveDisk1fromPegAtoPegBMoveDisk4fromPegAtoPegCMoveDisk1fromPegBtoPegCMoveDisk2fromPegBtoPegAMoveDisk1fromPegCtoPegAMoveDisk3fromPegBtoPegCMoveDisk1fromPegAtoPegBMoveDisk2fromPegAtoPegCMoveDisk1fromPegBtoPegC,總結如下:遞歸算法的執(zhí)行過程是不斷地自調(diào)用,直到到達遞歸出口才結束自調(diào)用過程;到達遞歸出口后,遞歸算法開始按最后調(diào)用的過程最先返回的次序返回;返回到最外層的調(diào)用語句時遞歸算法執(zhí)行過程結束。,代碼,,遞歸過程的實現(xiàn),,對于非遞歸函數(shù),調(diào)用函數(shù)在調(diào)用被調(diào)用函數(shù)前,系統(tǒng)要保存以下兩類信息:(1)調(diào)用函數(shù)的返回地址;(2)調(diào)用函數(shù)的局部變量值。當執(zhí)行完被調(diào)用函數(shù),返回調(diào)用函數(shù)前,系統(tǒng)首先要恢復調(diào)用函數(shù)的局部變量值,然后返回調(diào)用函數(shù)的返回地址。遞歸函數(shù)被調(diào)用時,系統(tǒng)要作的工作和非遞歸函數(shù)被調(diào)用時系統(tǒng)要作的工作在形式上類同,但保存信息的方法不同。,遞歸函數(shù)被調(diào)用時,系統(tǒng)的運行時棧也要保存上述兩類信息。每一層遞歸調(diào)用所需保存的信息構成運行時棧的一個工作記錄,在每進入下一層遞歸調(diào)用時,系統(tǒng)就建立一個新的工作記錄,并把這個工作記錄進棧成為運行時棧新的棧頂;每返回一層遞歸調(diào)用,就退棧一個工作記錄。因為棧頂?shù)墓ぷ饔涗洷囟ㄊ钱斍罢谶\行的遞歸函數(shù)的工作記錄,所以棧頂?shù)墓ぷ饔涗浺卜Q為活動記錄。,設計舉例,一般遞歸算法設計舉例,例1設計一個輸出如下形式數(shù)值的遞歸算法。nnn...n......333221,問題分析:該問題可以看成由兩部分組成:一部分是輸出一行值為n的數(shù)值;另一部分是原問題的子問題,其參數(shù)為n-1。當參數(shù)減到0時不再輸出任何數(shù)據(jù)值,因此遞歸的出口是當參數(shù)n≤0時空語句返回。算法設計:遞歸算法設計如下:voidDisplay(intn){inti;for(i=1;i0)Display(n-1);//遞歸//n<=0為遞歸出口,遞歸出口為空語句},代碼,例6-6設計求解委員會問題的算法。委員會問題是:從一個有n個人的團體中抽出k(k≤n)個人組成一個委員會,計算共有多少種構成方法。問題分析:從n個人中抽出k(k≤n)個人的問題是一個組合問題。把n個人固定位置后,從n個人中抽出k個人的問題可分解為兩部分之和:第一部分是第一個人包括在k個人中,第二部分是第一個人不包括在k個人中。對于第一部分,則問題簡化為從n-1個人中抽出k-1個人的問題;對于第二部分,則問題簡化為從n-1個人中抽出k個人的問題。圖6-7給出了n=5,k=2時問題的分解示意圖。,圖6-7委員會問題分解示意圖,當n=k或k=0時,該問題可直接求解,數(shù)值均為1,這是算法的遞歸出口。因此,委員會問題的遞推定義式為:,intComm(intn,intk){if(nn)return0;if(k==0)return1;if(n==k)return1;returnComm(n-1,k-1)+Comm(n-1,k);},例6-7求兩個正整數(shù)n和m最大公約數(shù)的遞推定義式為:,要求:(1)編寫求解該問題的遞歸算法;(2)分析當調(diào)用語句為Gcd(30,4)時算法的執(zhí)行過程和執(zhí)行結果;(3)分析當調(diào)用語句為Gcd(97,5)時算法的執(zhí)行過程和執(zhí)行結果;(4)編寫求解該問題的循環(huán)結構算法。,,解:(1)遞歸算法如下:intGcd(intn,intm){if(nn)returnGcd(m,n);elsereturnGcd(m,n%m);}(2)調(diào)用語句為Gcd(30,4)時,因m- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 算法 結構 課件 第二 遞歸 華北電力 大學 科技學院
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
鏈接地址:http://italysoccerbets.com/p-3501592.html