來(lái)源:互聯(lián)網(wǎng) 時(shí)間:2023-06-09 16:58:20
1、1 引言遞歸程序處理的問(wèn)題可以分成兩類(lèi):第一類(lèi)是數(shù)學(xué)上的遞歸函數(shù),要求算得一個(gè)函數(shù)值,例如階乘函數(shù)和Fibonacci函數(shù);第二類(lèi)問(wèn)題具有遞歸特征,目的可能是求出滿(mǎn)足某種條件的操作序列,例如Hanoi塔和八皇后問(wèn)題。
2、第一類(lèi)問(wèn)題的程序設(shè)計(jì)是簡(jiǎn)單的、機(jī)械的,而第二類(lèi)問(wèn)題則不然,由于涉及面廣,沒(méi)有統(tǒng)一的規(guī)則可循,所以編程過(guò)程往往比較復(fù)雜,而且編得的程序也不大好理解。
(相關(guān)資料圖)
3、究其原因在于,第一類(lèi)問(wèn)題已經(jīng)有了現(xiàn)成的函數(shù)公式,第二類(lèi)則沒(méi)有。
4、如果我們對(duì)于第二類(lèi)問(wèn)題也能寫(xiě)出它的遞歸公式,那么編碼過(guò)程會(huì)大大簡(jiǎn)化,而且還可以改善程序的可讀性。
5、本文將借助兩個(gè)程序?qū)嵗懻撨@種方法。
6、2 公式化方法程序設(shè)計(jì)可以分成兩個(gè)階段:邏輯階段和實(shí)現(xiàn)階段。
7、邏輯階段要確定算法,不必考慮編程語(yǔ)言和實(shí)現(xiàn)環(huán)境。
8、通常算法可以用自然語(yǔ)言、流程圖、NS圖等工具來(lái)表示,對(duì)于第二類(lèi)問(wèn)題能在邏輯階段得出它的遞歸公式,那么至少有這樣幾個(gè)好處:1. 把邏輯階段同實(shí)現(xiàn)階段截然分開(kāi),大大簡(jiǎn)化程序設(shè)計(jì)。
9、2. 用數(shù)學(xué)方法推導(dǎo)遞歸公式,要比用其他方法設(shè)計(jì)算法要簡(jiǎn)單得多。
10、3. 由于公式是算法的最精確最簡(jiǎn)潔的描述形式,有了遞歸公式,編碼工作就變得異常簡(jiǎn)單,而且程序的可讀性也會(huì)很好。
11、所謂遞歸程序設(shè)計(jì)的公式化方法,首先要把問(wèn)題表示成數(shù)學(xué)意義下的遞歸函數(shù),那么關(guān)鍵是確定函數(shù)值的意義,盡管問(wèn)題本身未必需要計(jì)算什么函數(shù)值。
12、函數(shù)值的選取可能不是唯一的,但是愈能表現(xiàn)問(wèn)題本質(zhì)愈好。
13、Hanoi塔問(wèn)題要求顯示為把若干個(gè)盤(pán)子從一柱搬到另一柱要采取的動(dòng)作,我們可以把動(dòng)作的個(gè)數(shù)取為函數(shù)值。
14、于是得到有四個(gè)自變量的遞歸函數(shù)h(d,f,t,u),其意義是以u(píng)柱(using)為緩沖把d個(gè)盤(pán)子(disks)從f柱(from)搬到t柱(to)。
15、容易得到下面的遞歸公式:h(1,f,t,u)=1h(d,f,t,u)= h(d-1,f,u,t)+ h(1,f,t,u)+ h(d-1,u,t,f), 如果d>1其實(shí)際意義非常明顯:搬動(dòng)一個(gè)盤(pán)子只需一個(gè)動(dòng)作;而把f柱上的d個(gè)盤(pán)子從f柱搬到t柱,需要先把上面的d-1個(gè)盤(pán)子從f柱搬到u柱,再把最下面的一個(gè)盤(pán)子從f柱搬到t柱,最后把已在u柱上的d-1盤(pán)子搬到t柱,因此總的動(dòng)作個(gè)數(shù)等于三組動(dòng)作之和。
16、有了遞歸公式,編程就變得極為簡(jiǎn)單。
17、程序的結(jié)構(gòu)是一個(gè)多分支結(jié)構(gòu),恰好同遞歸公式一一對(duì)應(yīng),編程幾乎變成了機(jī)械的翻譯。
18、在下面的程序中,遞歸函數(shù)與遞歸公式的差別只有當(dāng)d為1時(shí)不僅要把動(dòng)作個(gè)數(shù)v置為1,同時(shí)還要顯示此動(dòng)作。
19、main(){ int d,v,h(int,int,int,int);printf("disks = ");scanf("%d",&d);v=h(d,1,2,3);printf("%d actions for %d disks!",v,d);}int h(int d,int f,int t,int u){ int i,v;if(d==1){v=1;printf("%d->%d ",f,t);}else v=h(d-1,f,u,t)+h(1,f,t,u)+h(d-1,u,t,f);return v;}此程序的運(yùn)行會(huì)話如下:disks = 31->2 1->3 2->3 1->2 3->1 3->2 1->27 actions for 3 disks!3 例子:八皇后問(wèn)題八皇后問(wèn)題[2]是一個(gè)更有代表性更復(fù)雜的遞歸例題,要求在8×8的國(guó)際象棋棋盤(pán)上擺放8個(gè)皇后,使她們不致互相攻擊。
20、我們采取的算法仍然是從棋盤(pán)第一行開(kāi)始每行放一個(gè)皇后,對(duì)于每一行都從該行的第一列開(kāi)始放置,并判斷它同前面的那些皇后是否互相攻擊,如是就換成下一列,否則繼續(xù)放置下一個(gè)皇后,直至放好8個(gè)皇后。
21、依照這種思想,我們定義一個(gè)有9個(gè)自變量的函數(shù):q(k,a1,a2,a3,a4,a5,a6,a7,a8)其中k表示已放置的皇后個(gè)數(shù),而ai(此處i<=k)表示第i行上的皇后所在列的列號(hào),因此這9個(gè)自變量能夠代表求解過(guò)程中任一時(shí)刻的狀態(tài),而函數(shù)值定義為從此狀態(tài)出發(fā)能得到的解的個(gè)數(shù)。
22、按照這一思想不難得到下面的遞歸公式:q(k,a1,...,ak,0,...0)= 0 如果有0
23、將上面的遞歸公式很容易地翻譯成如下程序:main(){ int a[9],v,q(int,int *);v=q(0,a);printf("There are %d solutions!",v);}int q(int k,int *a){ int i,u,v;for(i=1,u=1;i
24、在q( )中首先計(jì)算ak是否同其前的所有ai相容,若是變量u非0。
25、q( )與遞歸公式嚴(yán)格對(duì)應(yīng),呈現(xiàn)出有三個(gè)選擇的分支結(jié)構(gòu)。
26、在u非0且k為8的情況下,置函數(shù)值v為1,并顯示已得到的解。
27、顯然這個(gè)程序編寫(xiě)起來(lái)最為簡(jiǎn)單,而且最好理解。
28、下面給出該程序的交互會(huì)話,為節(jié)省版面只列出92個(gè)解中的4個(gè):15863724 16837425 ... 83162574 84136275There are 92 solutions!4 結(jié)束語(yǔ)公式化方法是一種簡(jiǎn)單而有效的設(shè)計(jì)思想,它把程序設(shè)計(jì)和程序理解的難點(diǎn)都集中到遞歸公式上。
29、從上面的例子可以看到這種思想能夠簡(jiǎn)化程序設(shè)計(jì),而且得到的程序顯然好于通常的程序。
30、這種思想有普遍性,至少適用多數(shù)遞歸程序的設(shè)計(jì)。
31、由遞歸公式設(shè)計(jì)出的程序具有標(biāo)準(zhǔn)的分支結(jié)構(gòu),編寫(xiě)和理解都要簡(jiǎn)單得多。
32、上面的兩個(gè)例題在求得函數(shù)值的同時(shí),很容易地得到了要求的序列,但對(duì)于一般的問(wèn)題未必總是這樣。
33、筆者曾給出一種伴隨序列法,可以用來(lái)得到某些問(wèn)題(如顯示所有從m個(gè)數(shù)中取n個(gè)數(shù)的組合)要求的序列。
本文到此分享完畢,希望對(duì)大家有所幫助。
標(biāo)簽:
網(wǎng)友稱(chēng)PS4出現(xiàn)嚴(yán)重錯(cuò)誤 無(wú)法正常游玩已購(gòu)買(mǎi)游戲_今日熱門(mén)
據(jù)gamerant消息,PS4遇到了一個(gè)商店錯(cuò)誤,導(dǎo)致玩家購(gòu)買(mǎi)的游戲會(huì)被隨機(jī)
日版VC2005(日版vc2005)-訊息
來(lái)為大家解答以上問(wèn)題,日版VC2005,日版vc2005很多人還不知道,現(xiàn)在讓
突破平臺(tái)回踩之選股指標(biāo)公式
AA:=MA((2*C+H+L) 4,5);B1:=AA*1 02;B2:=AA*0 98;CC:=Abs((2*C+H+L)
焦點(diǎn)日?qǐng)?bào):水熊蟲(chóng)有多大_水熊蟲(chóng)對(duì)人有害
1、水熊蟲(chóng)是緩步動(dòng)物的俗稱(chēng),是一種生命力極強(qiáng)的生物,它們以植物和動(dòng)
“少年航天科普特訓(xùn)營(yíng)”舉行,VR空間站引關(guān)注