第章遞歸程序的正確性證明_第1頁
第章遞歸程序的正確性證明_第2頁
第章遞歸程序的正確性證明_第3頁
第章遞歸程序的正確性證明_第4頁
第章遞歸程序的正確性證明_第5頁
已閱讀5頁,還剩24頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章遞歸程序及其正確性證明本課的內容1.遞歸程序概述2.簡化的遞歸程序模型3.遞歸程序的計算規則4.遞歸程序的正確性證明

結構歸納法良序歸納法遞歸與迭代程序在程序設計中,處理重復性的計算常采用的方法是組織迭代循環和采用遞歸計算的方法,后者特別是在非數值領域中更是如此。可以證明每個迭代程序原則上總可以轉換成與它等價的遞歸程序;反之不然,并不是每個遞歸程序都可以轉換成與它等價的迭代程序。就效率而言,遞歸程序的實現往往比迭代程序耗費更多的時間與存儲空間。在具體實現時,又希望盡可能把遞歸程序轉化成等價的迭代程序,從而提高程序的時空效率。1.遞歸程序概述遞歸是常用的編程技術,其基本思想是“自己調用自己”。數學上最常見、最簡單的遞歸問題就是自然數的階乘。

n=1n!=1;n>1n!=n*(n-1)!;適合用遞歸方法求解的問題有一個初始狀態后續的情況可由前面的狀態推出如Fibonacci數列 F1=F2=1; Fn=Fn-1+Fn-21.遞歸程序概述直接或間接調用自身的程序稱為遞歸程序。遞歸實質上也是一種循環結構,它把“較復雜”情況的計算歸結為“較簡單”情況的計算,一直歸結到“最簡單”情況的計算為止。在數值計算領域可以采用遞歸計算,在非數值領域使用也非常廣泛。例如:

河內塔(HanoiTower)問題8皇后問題騎士巡游問題此外,遞歸是人工智能語言Lisp/Prolog等進行問題求解的基本手段。2.一種簡化的遞歸程序模型遞歸程序f(x1,x2,……,xn)可以描述為 f(x1,x2,……,xn)≡Ifp1thenE1

elseifp2thenE2……elseifpmthenEmelseEm+1其中pi和Ei中含有f。遞歸程序的例子計算最大公約數GCD(x,y):ifx=0thenyelseify<xthenGCD(y,x)elseGCD(x,y-x)GCD(8,4)=GCD(4,8)=GCD(4,4)=GCD(4,0)=GCD(0,4)=4計算F(x,y)=xyify=0then1elseifeven(y)thenF(x*x,y/2)elseF(x,y-1)*xF(4,3)=F(4,2)*4=F(16,1)*4=F(16,0)*64=1*64=64;遞歸程序的例子-多重遞歸計算McCarthy91函數M(x) ifx>100thenx-10 elseM(M(x+11)) 例如: M(105)=95 M(99)=M(M(110))=M(100)=M(M(111))=M(101)=91遞歸程序-多重遞歸Ackermann函數A(x1,x2)Ifx1=0thenx2+1elseifx2=0thenA(x1-1,1)elseA(x1-1,A(x1,x2-1))計算方法2(最內層調用)A(1,2)=A(0,A(1,1))=A(0,A(0,A(1,0)))=A(0,A(0,A(0,1)))=A(0,A(0,2))=A(0,3)=4采用兩種方法計算:A(1,2)計算方法1(最外層調用)A(1,2)=A(0,A(1,1))=A(1,1)+1=A(0,A(1,0))+1=(A(1,0)+1)+1=(A(0,1)+1)+1=(2+1)+1=43.遞歸程序的計算規則上例說明:1.遞歸程序可以采用不同的規則來計算。2.理論上已經證明,如果同一個遞歸程序的不同計算規則都終止,那么結果一定也相同。3.不同的計算過程雖然結果相同,但是時間復雜度和空間復雜度往往不同;實際工作的編譯器往往使用“最左最內”規則。(總是先計算最內層的最左的一個)4.采用不同的計算規則來計算遞歸程序時,對相同的子變元,計算過程可能終止,也可能不終止。采用不同計算規則結果不同的例子F(x1,x2):ifx1=0then0elseF(0,F(x1,x2))先計算最外層調用F(1,2)=F(0,F(1,2))=0先計算最內層調用F(1,2)=F(0,F(1,2))=F(0,F(0,F(1,2)))=……簡化LISP語言簡化的LISP程序中做如下規定。1.

基本的數據結構是原子和表(1)原子是指字母和數字組成的字符串,且字符之間不允許出現空格,并約定原子必須以字母A,B,C,D,E之一打頭,而以其他字母打頭的均指變量。(2)表是指由表元素組成的集合,表元素之間用空格隔開,整個集合用一對方括號[]括起來,表元素可以是原子或其他表。NIL表示空表。 例,①[ABC]——具有3個表元素的表

[A[BA1[C]]D]——具有3個(頂層)表元素的表,其中A和D均為原子,[BA1[C]]是一個表,該表的第3個表元素[C]又是一個表。

簡化LISP語言五種基本函數1.“=”測試函數 功能:檢查兩個原子或表是否相同,若相同,其值為true,否則其值為false。

A=A為true[AB]=[AB]為true[AB]=[BA]為false[AB]=[A[B]]為false2.原子測試函數ATOM(x) 功能:檢查自變元x是否為原子或空表,若是,其值為true,否則,取值為false。

ATOM(A)為true

ATOM(NIL)為true

ATOM([AB])為false

ATOM([A])為false簡化LISP語言3.函數CAR(L) 功能:提取表的第一個元素,返回原子或者表。

CAR([ABC])=A

CAR([[AB]C])=[AB]CAR(A)和CAR(NIL)無定義4.函數CDR(L) 功能:取刪除表頭元素后,余下的元素所組成的表。

CDR([ABC])=[BC]

CDR([A[BC]])=[[BC]]CDR([[AB]C])=[C]

CDR([A])=NILCDR(A)與CDR(NIL)均無定義5.函數CONS(x,L) 功能:將x加到表L中,作為表頭元素得到的新表。CONS(A,[BC])=[ABC]CONS([A],[BC])]=[[A]BC] CONS(A,B)無定義基于簡化LISP語言的遞歸例子例1:求一個表L中的最大元素MAX(L):ifCDR(L)=NILthenCAR(L)elseifCAR(L)>MAX(CDR(L))thenCAR(L)elseMAX(CDR(L))MAX([2564])=MAX([564])=MAX([64])=6

基于患簡化LI繞SP語言枯的遞佩歸例蒙子例2:判濁斷x是否似是表L中的碑某個(頂層)元素ME挽MB乘ER替(x搖,L):If擇L催=N摔IL怖t泰he魯n僚fa短ls符eel鉤se窯i受f難x=弦CA匆R(輕L)盾t削he碑n稅tr民ueel哥seME杠MB內ER諒(x哀,C澆DR環(L))ME預MB損ER勿(C堆,[彈A瓦B罪C眼D]除)霉ME絨MB浸ER辮(C記,[男A待B解[C堪]]演)=M曲EM絞BE雅R(岡C,鹿[B乘C孤D券])逐=更M碗EM扶BE沙R(擇C,蛙[B穿[吩C]居])=M寇EM許BE倒R(瘦C,挪[C說D鑒])伯=挖ME伍MB屑ER尼(C津,[汁[C挖]]借)=T坑ru汁e趙=毀ME泊MB渣ER舟(C齒,N微IL盆)=F時al大se基于反簡化LI轎SP語言命的遞權歸例旅子例3:將表L1和表L2合并舟成一丑個新費表,析且L1的元們素置L2之前簽的遞廈歸程送序AP晴PE同ND宅(L惹1,眾L2夫):if噴L隊1=摩NI讀L母th曾en煮L適2el外se劫C析ON暗S(直CA貓R(錘L1瘦),扶AP籍PE生ND志(召CD文R(字L1黃),而(L濁2)腐))例如蝴:AP心PE痰ND俗([縱A狼B]悶,[堂C拍D]籌)=CO披NS注(A是,A魂PP烏EN芬D(事[B繞],返[C換D滴])抵)=CO朋NS的(A撇,C寶ON稍S(燃B,昆AP截PE踩ND讓(N灶IL換,[碼C野D]絮))繪)=CO頑NS姻(A怎,C壩ON裁S(翅B,霞[C水D噴])哲)=CO證NS篇(A疑,[單B倒C養D]闊)=步[A梅B到C蘋D例]請注柏意AP各PE油ND和CO瞞NS的區礎別:CO均NS慨([山A扮B]黎,[吐C飄D]丙)=濕[[騰A糟B]尺C筑D襲]AP族PE扒ND餡([耐A億B]呆,[蹲C蚊D]齡)=暈[A著B遼C硬D頃]4.遞歸鉗程序沈的正琴確性爹證明思路序:(1)證色明對殘于“邀最簡地單”耍的數相據,熱程序只運行鄙正確綠;(2)假鋪設對南于“腸較簡西單”牌的數爸據,賠程序帥運行令正確[“歸納假詢設”],在叔此基雖礎上徹證明役對于蝕“較磚復雜車”的妥數據嶼,程序講亦運職行正覽確。注:攜其中梯的“字數據順”可趙以是尿一般順的數消值,繞也可刃以是斤由數摔值、原子絮或表榮等組狹成的醫某種梁數據攪結構稠。這種硬證明牙遞歸節程序撤正確弦性的饅基本礎思想肅與通坊常的邁數學蠶歸納知法是哥很類維似的恩--結構弄歸納繼法。結構微歸納淚法例1,求恒階乘塘的遞拆歸程火序F(父x):if邪x痕=1乓t鑄he粘n敞1el碗se詳x候*F毅(x懸-1爬)證明執:(攪對于舞所有宵正整神數x,F(那x)=粱x!)輸入批、輸廢出斷術言為:I(x嫂):固x>每0(茄x為正整數賀)、O(x東,z效):捕z=槍x!。對正巷整數售x進到行歸欺納:(1誓)斯x=裹1時迎,F波(1勒)=詠1=合1!(2政)糠歸納塑假設負。設請對任感意正飽整數斃x,F(愉x)降=x戒!。x是躲正整搜數,肉所以傲x+蠢1=賺1為寧假,元根據兼程序競有F(歐x+零1)狐=(掘x+鈴1)違*F穴((師x+利1)責-1麻)=吹(x蠅+1副)*獲F(沖x)既=(程x+顯1)股*x堆!艦(根超據歸槳納假史設)=(執x+庸1)賞!程序的部分糕正確性得稠到了芬證明。結構碼歸納幣法在以蟻上的抓歸納絮證明舒中,雞是對演程序牧所操紋作的施變量雙(正樂整數)進行法歸納端,然宴而許書多程葡序并腦沒有梨明確未可歸插納的貢整數街,因糖此在爆大多步數時姻候,脖需要淹對程相序的數據膠結構進行每歸納掘,這亡也是努結構仿歸納似法和叼一般絲式的數憶學歸捆納法片的區燦別所冰在。結構滑歸納慮法例2,將堤表L1和表L2合并憤為一亦個新偽表,舍且L1的元奇素置L2之前碎的遞埋歸程晉序AP貸PE燦ND制(L跑1,坐L2槽):if淚L值1=址NI遞L鐮th筆en域L哥2el食se鑒C俯ON皆S(眉CA軟R(帽L1貧),丙AP稍PE巴ND喝(紛CD視R(勢L1革),宅L2歷))證明謀:對第享一個扔自變菌元所柄包含纖元素杠的個侮數進定行歸焦納。(1)證洋明對馬于含鳥有0個元收素的L1,程甚序運句行正下確。當L1打=N揪IL時,AP濕PE葛ND傘(N霜IL崗,L君2)皮=L讓2程序渾運行赴正確結構見歸納搞法(2)歸靈納假矩設:假設慮對于挺任何裂含有N個元奔素的貞表L1勒’,程爭序運貴行正乎確,散即AP匠PE四ND傍(L涌1’油,L淚2)是由L1蒜’的元芳素后楊跟L2的元秤素組專成的完表。躺對于踐含有N+竄1個元才素的爽表L1:設L1=[l1l2…lN+嬸1],L2=[l’1l’2…l’M]由于N+死1>展0,則AP吃PE浴ND金(L拔1,告L2獎)=CO保NS浮(C宏AR曉(L付1)擦,A綠PP某EN姜D彈(C業DR編(L妹1)喪,(珍L2凝))學)=CO伐NS祥(l1,A遲PP者EN肉D幅(C著DR缸(L幼1)電,(扛L2殖))結構捎歸納蓄法由歸嘉納假傾設,AP繞PE偷ND煉(亮CD誦R(鼻L1奪),哄(L紗2)石)=[l2…lN+坐1l’1l’2…l’M]所以CO量NS府(l1,A多PP執EN虧D蓋(C旋DR贈(L資1)鋸,(售L2奴))=[l1l2…lN+啦1l’1l’2…l’M]良序慢歸納稱法良序燥歸納愚法是踏一種悼較強管形式讀的結散構歸食納法壞,適辦合更柜為復賽雜的抹遞歸健程序找證明設(W凳,妖)是一疑個良京序集扁,P(擇x)是一產個命臟題,棋為了跌證明絞對于笨所有致的x∈W,P(童x)為真糠,只圈要1.室證明P(殖x0)為真巨,其糾中x0是W中的里“最稿小”遷元素2.勻歸納順假設錘:對融于所乖有的x’x,凡P(班x’)都為散真,妻在此腿基礎顫上證匆明P(供x)為真良序夜歸納厘法例1,證認明Ac繳ke暫rm你an續n函數隆的正班確性A(淺x1,x2):牲if吧x1=0悔t婆he傘n碌x2+1el譽se猾i勁f豎x2=0菠t杯he槳n布A(賞x1-1帽,1曉)el啦se岸A砌(x1-1捏,A磚(x1,食x2-1見))對于方任何慘非負賄整數坐對(x1,x2)計算善終止楚。1.摟本例荷中,x1,x2在程濁序中移都不提斷的餃減小觸,其廚中x2是在兔內層制調用跡中減碎小。2.剝選取滋良序斜集(W,),恭其中W=雙{(升x1,x2)}己,x1,x2是非報負整看數,汗為頓字典羅順序崗。3.飽定義眉命題P(笛x1,x2):誓A(之x1,x2)計算捐終止忘。良序桿歸納紙法證明蕉:1.訪對于W中的貧最小盒元素緣瑞(0腿,0淡),P(勻x1,x2)終止挨;2.棉如果娘,對廢于所有炭的(x1’,甩x2’)(x1,x2),求P(過x1’,系x2’)為真眼,在膨此基部礎上評證明P(停x1,x2)為真倒。對于W中的別最小絕元素彎(0尾,0準),由于A(唇0,將0)排=英0+縱1=會1,計算卷顯然吼終止您,因童此,P(蘭0,歐0)成立良序編歸納燙法假設曾所有槽的(x1’,澇x2’)俗(x1,x2),圍P(倍x1’,蔑x2’)為真偉,在拌此基臺礎上日證明P(鄙x1,x2)為真森。1.營當x1=0攝,擠x2≠0時,A(病x1,x2)=士A(惕0,貼x2)=窯x2+1降,程序仗終止貞,命那題成怒立;2.濕當x1≠0,價x2=0時,A(抓x1,x2)=續A(掃x1,0)=鋸A(爽x1-1目,1妥),由于(x1-1答,1狂)碑(x1,x2),根據簽假設潮可知桃,命護題成因立;3.際當x1≠0,凳x2≠0時,A(詳x1,x2)=死A(頸x1-1蜘,A儉(x1,鵲x2-1拜))榨,按照躬“最內安最左”原年則,先計編算A(善x1,險x2-1亦),由于(x1,神x2-1鴉)(x1,x2),故z=淡A(散x1,粗x2-1陪)終止肆;又由街于(x1-1特,z澆)竹(籮x1,x2),所以A(載(x1-1扣),謙z)終止疾;因此A(菌x1,x2)也終免止,前命題丹成立乎。良序你歸納覽法例2,證曬明計裕算最儉大公擱約數束的程娃序GC閣D(王x,赤y)的正劫確性董(x≥0∧

溫馨提示

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

評論

0/150

提交評論