You are on page 1of 28

Quy quy ch v cch kh

Posted on 13/12/2010

I. Cc Khi nim v Quy (recursion):

1. M t quy: M t mang tnh quy v mt i tng l m t theo cch phn tch i tng thnh nhiu thnh phn m trong s cc thnh phn c thnh phn mang tnh cht ca chnh i tng c m t. Tc l m t i tng qua chnh n. V d: M t quy tp s t nhin N: - S 1 l s t nhin ( 1 N). - S t nhin bng s t nhin cng 1. (n N (n+1) N) 2. Cc loi quy: C 2 loi: quy trc tip v quy gin tip. - quy trc tip l loi quy m i tng c m t trc tip qua n: A m t qua B, C,.. trong B, C, khng cha A. - quy gin tip l loi quy m i tng c m t gin tip qua n: A m t qua A1, A2, , An. Trong c mt Ai c m t qua A. 3. M t quy cc cu trc d liu: Trong ton hc, lp trnh ngi ta thng s dng quy m t cc cu trc phc tp, c tnh quy. Bi m t quy khng ch l cch m t ngn gn m cn to kh nng xy dng cc thao tc x l trn cc cu trc phc tp. Mt cu trc d liu c tnh quy thng gm mt s thnh phn d liu cng kiu c ghp ni theo cng mt phng thc.

V d: M t quy mng nhiu chiu: - Mng mt chiu l dy c th t cc thnh phn cng kiu. - Mng n chiu l mng 1 chiu m cc thnh phn c kiu mng n 1 chiu. 4. M t quy gii thut: a. Gii thut quy l gii thut c cha thao tc gi n n. Gii thut quy cho php m t mt dy ln cc thao tc bng mt s t cc thao tc trong c cha thao tc gi li gii thut (gi quy). Mt cch tng qut mt gii thut quy c biu din nh mt b P gm mnh S (khng cha yu t quy) v P : P P[ S, P ]. v Thc thi gii thut quy c th dn ti mt tin trnh gi quy khng kt thc khi n khng c kh nng gp trng hp dng, v vy quan tm n iu kin dng ca mt gii thut quy lun c t ra. kim sot qu trnh gi quy ca gii thut quy P ngi ta thng gn thao tc gi P vi vic kim tra mt iu kin B xc nh v bin i qua mi ln gi P, qu trnh gi P s dng khi B khng cn tha. - M hnh tng qut ca mt gii thut quy vi s quan tm n s dng s l: P if B then P[ S, P] Hoc: P P[ S, if B then P ] - Thng thng vi gii thut quy P, m bo P s dng sau n ln gi ta chon B l (n > 0). M hnh gii thut quy khi c dng. P(n) If ( n > 0 ) then P[ S , P(n - 1)] ; Hoc P(n) P[ S , if (n >0) then P(n - 1) ] v Trong cc ng dng thc t s ln gi quy ( su quy) khng nhng phi hu hn m cn phi nh. Bi v mt ln gi quy s cn mt vng nh mi trong khi vng nh c vn phi duy tr. b. Chng trnh con quy.

v Cc hm quy: nh ngha hm s bng quy thng gp trong ton hc, in hnh l cc hm nguyn m t cc dy s hi quy. V d: Dy s Fibonaci(FiBo): { FiBo (n)} 1, 1, 2, 3, 5, 8, 13, 21, 34, .. Gii thut quy tnh FiBo(n ) l: FiBo(n) if ((n = 0) or (n = 1)) then return 1; else return (FiBo(n 1) + FiBo(n 2)); Nhn xt: Mt nh ngha hm quy gm: + Mt s cc trng hp suy bin m gi tr hm ti c bit trc hoc c th tnh mt cch n gin (khng quy). V d: FiBo(0) = FiBo(1) = 1; + Trng hp tng qut vic tnh hm gi tr b hn (gn gi tr neo) ca i s. Nh: FiBo(n) = FiBo(n 1) + FiBo(n 2). v Cc th tc quy: Th tc quy l th tc c cha lnh gi n n. Th tc quy thng c s dng m t cc thao tc trn cu trc d liu c tnh quy. 5. M ha gii thut quy trong cc ngn ng lp trnh: Khng phi mi ngn ng lp trnh hin c u c th m ha c gii thut quy, ch mt s nhng ngn ng lp trnh c kh nng t chc vng nh kiu stack mi c kh nng m ha c gii thut quy. Cc ngn ng lp trnh hin nay u m ha gii thut quy bng cch t chc cc chng trnh con quy tng ng.

Ngn ng C++ cho php m ha gii thut quy mt cch thun li nh vo k thut khai bo trc tiu nn khng c s phn bit hnh thc no trong vic khai bo gia hm con quy v hm con khng quy. 6. Mt s gii thut quy n gin thng gp: a. quy tuyn tnh: Chng trnh con quy tuyn tnh l chng trnh con quy trc tip n gin nht c dng: P { Nu tha iu kin dng th thc hin S; Cn khng begin { thc hin S*; gi P} } Vi S, S* l cc thao tc khng quy. b. quy nh phn: Chng trnh quy nh phn l chng trnh con quy trc tip c dng: P { Nu tha iu kin dng th thc hin S; Cn khng begin { thc hin S*; gi P; gi P } } Vi S, S* l cc thao tc khng quy. c. quy phi tuyn: Chng trnh con quy phi tuyn l chng trnh con quy trc tip m li gi quy c thc hin bn trong vng lp. Dng tng qut ca chng trnh con quy phi tuyn l: P { for gi tr u to gi tr cui do Begin thc hin S; If (tha iu kin dng) then thc hin S* Else gi P End;

} Vi S, S* l cc thao tc khng quy. II. Bi Ton Quy 1. Cc bc thc hin tm gii thut quy cho mt bi ton. xy dng gii thut cho mt bi ton c tnh quy bng phng php quy ta cn thc hin tun t 3 ni dung sau: - Thng s ha bi ton. - T cc trng hp dng cng gii thut tng ng. - Tm gii thut trong trng hp tng qut bng phn r bi ton theo kiu quy. a. Thng s ha bi ton: Tng qut ha bi ton c th cn gii thnh cng bi ton tng qut (mt h cc bi ton cha bi ton cn gii), tm ra cc thng s cho bi ton tng qut c bit l nhm cc thng s biu th kch thc ca bi ton cc thng s iu khin ( cc thng s m ln ca chng c trng cho phc tp ca bi ton., v gim i qua mi ln gi quy. V d: n trong hm FiBo(n) v phn trn. b. Pht hin cc trng hp suy bin (neo) v tm gii thut cho cc trng hp ny. y l cc trng hp suy bin ca bi ton tng qut, l cc trng hp tng ng vi cc gi tr bin ca cc bin iu khin (trng hp kch thc bi ton nh nht), m gii thut khng quy (thng rt n gin). V d: FiBo(0) = FiBo(1) = 1 trong v d phn trn. c. Phn r bi ton tng qut theo phng thc quy: Tm gii thut cho bi ton trong trng hp tng qut bng cch phn chia n thnh cc thnh phn c gii thut quy hoc l bi ton trn nhng c kch thc nh hn. V d: quy giai tha: FAC(n) = n* FAC(n 1).

Tm gi tr ln nht. Tmax(a[1:n]) = max (Tmax ()a[1: (n-1)], a[n]) 2. Mt s bi ton gii bng gii thut quy in hnh: a. Bi ton thp H Ni (HaNoi Tower) Truyn thuyt k rng: Mt nh ton hc Php sang thm ng Dng n mt ngi cha c H Ni thy cc v s ang chuyn mt chng a qu gm 64 a vi kch thc khc nhau t ct A sang ct C theo cch: - Mi ln ch chuyn 1 a. - Khi chuyn c th dng ct trung gian B. - Trong sut qu trnh chuyn cc chng a cc ct lun c xp ng(a c kch thc b c t trn a c kch thc ln).

Khi c hi cc v s cho bit khi chuyn a xong chng a th n ngy tn th! Ta c th tnh c thi gian di chuyn ht 64 a v ng v tr ca n: Gi s thi gian di chuyn mt a l t gi th thi gian chuyn xong chng 64 a l: T = ( 264 1) * t S = 1.84 * 1019 * t S Vi t = 1/100 s th T = 5. 8 * 109 nm = 5.8 t nm Bi ton phc tp ny c th gii rt n gin bng gii thut quy. Thng s ha bi ton Xt bi ton mc tng qut nht: chuyn n (n >= 0) t ct X sang ct Z ly ct Y lm trung gian.

Ta gi gii thut bi ton mc tng qut l th tc THN(n, X, Y, Z) cha 4 thng s n, X, Y, Z; n thuc tp s t nhin N; X,Y, Z thuc tp cc k t. Bi ton c trn s c thc hin bng li gi THN(64, A, B, C). D thy rng: trong 4 thng s ca bi ton th thng s n l thng s quyt nh phc tp ca bi ton ( n cng ln th s thao tc di chuyn a cng nhiu v th t thc hin cng kh hnh dung), n l thng s iu khin. Trng hp suy bin v cch gii Vi n = 1 bi ton tng qut suy bin thnh bi ton n gin THN(1, X, Y, Z) : tm dy thao tc chuyn chng a 1 a t ct Z sang ct Z ly ct Y lm trugn gian. Gii thut gii bi ton THN (1, X, Y, Z) c thc hin ch 1 thao tc c bn: Chuyn 1 a t X sang Z (k hiu l Move(X, Z)): THN(1, X, Y, Z) { Move(X, Z) } Vi trng hp suy bin n = 0, th khng phi thc hin thao tc no c. THN(0, X, Y, Z) { rng } Phn r bi ton Ta c th phn r bi ton THN(k, X, Y, Z): chuyn k a t ct X sang ct Z, ly ct Y lm trung gian thnh dy tun t 3 cng vic nh sau: - Chuyn (k -1) a t ct X sang ct Y ly ct Z lm trung gian: THN(k-1, X, Y, Z) (bi ton THN vi n = k -1, X = X, Y = Y, Z = Z). - Chuyn 1 a t ct X sang ct Z: Move(X, Z). - Chuyn (k -1) a t ct Y sang ct Z ly ct X lm trung gian: THN(k-1, Y, X, Z) (bi ton THN vi n = k-1, X = Y, Y = X, Z = Z). Vy gii thut trong trng hp tng qut ( n > 1) l: THN(n, X, Y, Z) { THN (n -1,X,Z,Y) ;

Move ( X, Z ) ; THN (n -1,Y,X,Z) ; } Vi n a th cn bao nhiu bc chuyn 1 a? Thc cht trong th tc THN cc lnh gi quy ch nhm sp xp trnh t cc thao tc chuyn 1 a. S ln chuyn 1 a c thc hin l c trng cho phc tp ca gii thut. Vi n a, gi f(n) l s cc thao tc chuyn 1 a. Ta c: f(0) = 0; f(1) = 1; f(n) = 2f(n-1) + 1; vi n > 0; do : f(n) = 1 + 2 + 22 + + 2n-1 = 2n 1 chuyn 64 a cn 264 - 1 bc hay xp x 1020 bc. Cn khong 10 triu nm vi mt my tnh nhanh nht hin nay lm vic ny. Chng trnh m ha gii thut THN trong C++

b. Bi ton tm nghim xp x ca phng trnh f(x) = 0

Bi ton: Hm f(x) lin tc trn on [a0, b0], tm mt nghin xp x vi chnh xc trn [a0, b0] ca phng trnh f(x) = 0. tng gii thut: - Trng hp neo: b0 a0 < + Nu f(a0).f(b0) <= 0 th hm f c nghim trn [a0, b0]. V ta ang tm nghim xp x vi chnh xc a0 l nghim xp x cn tm. + Nu f(a0).f(b0) > 0 th ta xem nh khng c nghim xp x trn on xt. - Trng hp b0 a0 > th chia i on [a0, b0] ri tm ln lt nghim trn tng on con: on con tri, on con phi. Ta s xy dng mt hm quy tr v gi r l nghim xp x ca f (nu c), hay mt hng E ( ln) nu f khng c nghim xp x trn [a0, b0]. Thng s ha bi ton. Xt hm FUN vi 3 thng s l g, a, b, (FUN (g, a, b)) tr v gi tr nghim xp x ca phng trnh g(x) = 0 trn on [a ,b] hoc gi tr C nu phng trnh ang xt khng c nghim xp x. gii bi ton ban u ta gi hm FUN(f,a0,b0). Trng hp suy bin (tm thng) ba< Khi : Nu ( g(a).g(b) ) <= 0 th FUN(g, a, b) = a; // a l nghim xp x. Cn khng th FUN(g, a, b ) = E; // khng c nghim xp x. Phn r trng hp tng qut. Khi b a > = ta phn [a, b] lm 2 on [a, c] v [c, b] vi c = (a + b)/ 2. - Nu FUN(g, a, c) < E th FUN(g, a, b) = FUN(g, a, c) . ( y l bi ton tm nghim trn on [a, c]). - Cn khng th FUN(g, a, b) = Fun(g, c, b). (bi ton tm nghim trn on [c, b]). Hm tm nghim xp x trn C++ const double epsilon = ; const double E = ; double FUN(double a , double b ) { if((b a) < epsilon ) if(f(a)*f(b) <= epsilon return (a ) ;

else return ( L ) ; else { double c = (a + b ) / 2 ; double F = FUN(a , c) ; if( F < E ) return F ; else return ( FUN(c , b) ) ; } } III. C Ch Thc Hin Gii Thut Quy. 1. Xt gii thut quy tnh gi tr hm FIBONACCI. FIB(n) if ((n = 0 ) or ( n = 1 )) then return 1 ; else return ( FIB(n 1) + FIB(n 2)) ; S tnh FIB(5):

2. Xt th tc quy thp H Ni THN(n, X, Y, Z) void THN( int n , char X,Y,Z) { if(n > 0) { THN(n -1,X,Z,Y ) ; Move ( X , Z ) ; THN(n 1,Y,X,Z ) ; } return ; } chuyn 3 a t ct A sang ct C dng ct B lm trung gian ta gi: THN(3,A, B, C). S thc hin li gi THN(3, A, B, C) l:

Vi THN(0, X, Y, Z) l trng hp suy bin tng ng vi thao tc rng. X - Y l thao tc chuyn 1 a t ct X sang ct Y (MOVE(X, Y)). Cc bc chuyn a s l: A C; A B; C B; A C; B A ; B C; A C - Li gi cp 0: THN(3, A, B, C) s lm ny sinh 2 li gi cp 1: THN(2,A,B, C); THN(2, B, A, C) cng vi cc thng tin ca qu trnh x l cn dang d. - Cc li gi cp 1: THN(2, A, C, B), THN(2, B, A, C) s lm ny sinh li gi cp 2: THN(1, A, B, C); THN(1, C, A, B); THN(1, B, C, A); THN(1, C, B, A); cng vi cc thng tin ca qu trnh cn x l dang d. - Cc li gi cp 2: THN(1, A, B, C); THN(1, C, A, B); THN(1, B, C, A); THN(1, A, B, C); s lm ny sinh cc li gi cp 3 di dng THN(0, X, Y, Z); cng vi cc thng tin ca qu trnh x l cn dang d. Qu trnh gi dng li khi gp trng hp suy bin. Qu trnh x l ngc vi qu trnh gi bt u khi thc hin xong cc trng hp neo nhm hon thin cc bc x l cn dang d song song vi qu trnh hon thin cc li gi l qu trnh loi b cc lu tr thng tin gii thut trung gian.

Do c im ca qu trnh x l mt gii thut quy l: vic thc thi li gi quy sinh ra li gi quy mi cho n khi gp trng hp suy bin (neo) cho nn thc thi gii thut quy cn c c ch lu tr thng tin tha cc yu cu sau: - mi ln gi phi lu tr thng tin trng thi con dang d ca tin trnh x l thi im gi. S trng thi ny bng s ln gi cha c hon tt. - Khi thc hin xong mt ln gi cn khi phc li ton b thng tin trng thi trc khi gi. - Lnh gi cui cng (ng vi trng hp suy bin) s c hon tt u tin, th t dy cc lnh gi c hon tt ngc vi th t gi, tng ng dy thng tin trng thi c hi phc theo th t ngc vi th t lu tr. Cu trc d liu cho php lu tr dy thng tin tha 3 yu cu trn l cu trc lu tr tha lut LIFO (Last In First Out). Mt ku cu trc lu tr thng c s dng trong trng hp ny l cu trc chng (Stack). Trong ngn ng C++ thc hin c ch quy nh trong qu trnh bin dch, phn mm ngn ng t ng pht sinh ra cu trc stack qun l cc lnh gi chng trnh con. Khi mt lnh gi chng trnh con thc hin, cc bin a phng (gm c cc thng s) s c cp pht vng nh mi nh stack. Nh vy cc tc ng a phng ca th tc s khng lm thay i cc trng thi x l cn dang d. IV. Kh Quy 1. Tng quan vn kh quy. quy l phng php gip chng ta tm gii thut cho cc bi ton kh. Gii thut gii bi ton bng quy thng rt p (gn gng, d hiu, d chuyn thnh chng trnh). Nhng vic x l gii thut quy li thng lm tn khng gian nh v thi gian x l, hn na khng phi mi ngn ng lp trnh u cho php m ha quy. V vy, vic thay th mt chng trnh quy bng mt chng trnh khng quy cng l mt vn c quan tm nhiu trong lp trnh. Mt cch tng qut ngi ta ch ra rng: Mi gii thut quy u c th thay th bng mt gii thut khng quy. Vn cn gi l k thut xy dng li gii thut khng quy tng ng thay th gii thut quy. Cng vic xy dng li mt gii thut khng quy khng phi bao gi cng n gin v cho n nay vn cha c gii php tha ng cho trng hp tng qut. S xy dng chng trnh cho mt bi ton kh khi ta khng tm c gii thut khng quy thng l:

+ Dng quan nim quy tm gii thut cho bi ton. + M ha gii thut quy. + Kh quy c c mt chng trnh quy. Tuy nhin do vic kh quy khng phi bao gi cng d v v vy trong nhiu trng hp ta cng phi chp nhn s dng chng trnh quy. 2. Cc trng hp kh quy n gin a. S dng vng lp: v Hm tnh gi tr ca d liu m t bng hi quy. Gii thut tnh gii tr ca dy hi quy thng gp dng: F(n) = C Khi n = n0 ( C l mt hng) = g(n, f(n, n-1)) khi n> n0 V d: Hm giai tha FAC(n) = n! = 1 khi n = 0 = n*FAC(n 1) khi n > 0 Hm tnh giai tha khng quy: long int FAC ( int n) { int k = 0; long int F = 1; while(k < n) F = ++k * F; return F; } v Cc th tc quy dng quy ui

Xt th tc P dng: P(X) if (B(X)) D(X) Else { A(X); P(f(X)); }

S khi qu trnh thc hin lnh gi th tc P(X) c dng sau:

Tng ng vi vng lp sau: While(! B(X)) { A(X); X = f(X);

} D(X); V d: Tm c chung ln nht (UCLN) ca 2 s nguyn da vo thut ton Euclide. Gii thut quy tm UCLN(m, n) bng thut ton Euclide: UCLN(m , n , var us) if ( n = 0 ) us = m ; else USCLN(n , m mod n , us ) ;

- Th tc khng quy ca bi ton tm UCLN trong C++

V. Cc ham quy dng quy ui (tail -recusitive). Xt cc hm quy dng:

Tc l: f(X) if( C(X) ) return ( f (g(X)));

else return (a(x)); on chng trnh tnh f = f(X0) l: U = X0; While( C(U)) U = g(U); f = a(U); V d: Vi m, n >= 0 ta c hm quy tnh UCLN(m, n) l: UCLN(m ,n ) if (m != 0 ) return(UCLN ( abs(m n) , min(m , n) ) ; else return n ; - Dng hm quy tng ng trong C++ int USCLN(int m , int n) { while( n != 0) { int t1 = m ; int t2 = n ; m = abs(t1-t2) ; if(t1<t2) n = t1 ; else n = t2 ; } return(m) ; } b. Kh quy hm quy ARSAC: v Dng hm quy ARSAC. - Dng ton hc

- Dng gii m: A(X ) if C(X) return (DS ( A( CS (X) ), FS(CS (X). X) ) ); else return (BS(X)); vi: BS, CS, DS, FS l cc gii thut khng quy. Trng hp thng gp l: BS(X), CS(Y), DS(U, V), FS(U, V) l cc thao tc n gin, khng c lnh gi hm con. X, Y, U, V l bin n tr hoc bin vector. y l dn tng qut ca hm quy ch gi n chnh n mt ln. v S tng qut tnh gi tr A(X): Gi U0 X l gi tr i s cn tnh ca hm A. Vic tnh A(U0) s pht sinh lnh gi tnh A(U1) vi U1 = CS(U0) (gi s C(U0) = true). C nh vy, khi m C(Ui) cn ng th vic tnh A(Ui) s pht sinh lnh tnh A(Ui +1) vi Ui = CS(Ui). Vi gi thit l U0 = X thuc min xc nh ca A, th qu trnh lp li cc lnh gi ny phi dng li sau hu hn ln gi. Tc l k tha:
+1

C(U0) = C(U1) = = C(Uk 1 ) = true, C(Uk ) = false. Xt dy s: + Dy: {Ui} = {CS(Ui)} (1.) U0 = X {cho trc} Ui + 1 = CS(Ui) i = 0 k-1 + Dy: { Vi } = { A(Ui)} (2.) V0 = A(U0 ) = A(X0) (gi tr cn tnh). Vi = A(Ui ) = DS(A( CS( Ui )), FS(CS(Ui), Ui) ) = DS(A( Ui + 1)), FS(Ui + 1)) = DS(Vi + 1, FS(Ui + 1, Ui)) vi 0 < i < k Vk = BS(Uk ) (v C(Uk) =false ) Da vo dy s {Ui}, {Vi} (m t bi (1.) v (2.) ta tnh A(X) theo gii thut sau:

Tnh v ghi nh cc Ui t 0 n k theo (2.) (Vi C(U0) = C(U1) = = C(Uk 1) = true, C(Uk) = false ) - S dng gi tr Ui tnh ln c ngc Vi t k xung 0 theo (2.), V0 chnh l gi tr cn
-

tnh (V0 = A(X)). v Gii thut khng quy tnh gi tr hm ARSAC bng s dng cu trc Stack. - Bc 1: tnh Ui bt u t U0 theo (2.) lu vo Stack S. CreateStack(S); (to stack rng S) K = 0; U = X; (U0 = X) push(S, U); (chn U0 vo nh stack S) while(C(U)) { k = k + 1; U = CS(U); (Uk + 1 = CS(Uk)) push(S, U); // Chn Uk + 1 vo nh Stack S. } - Bc 2: Ly d liu trong Stack S tnh Vi theo (2.) pop(S, U) ; (U = Uk) V = BS(U) ; (C(Uk ) sai; V = Vk = BS (Uk)) for (int i = 0; i < k; i++) { Y = U; pop (S, U) ; (U = Ui) V = DS(V, FS(Y, U )); (C(Ui) ng; Vi = DS (Vi + 1, FS(Ui + 1, Ui))) } V = A(X0); 3. Kh quy mt s dng th tc quy thng gp a. Dn nhp. Thc hin mt chng trnh con quy theo cch mc nh thng tn b nh v cch t chc Stack mt cch mc nh thch hp cho mi trng hp thng l khng ti u

trong tng trng hp c th. V vy s rt tt khi ngi lp trnh ch ng to ra cu trc d liu Stack c dng cho tng chng trnh con quy c th. b. Th tc quy ch c mt lnh gi quy trc tip. M hnh tng qut ca th tc quy ch c mt lnh gi quy trc tip l: P(X) if C(X) { D(X) } else A(X); P(f(X)); B(X); Vi: X l mt bin n hoc bin vector. C(X) l mt biu thc boolean ca X. A(X), B(X), D(X) l cc nhm lnh khng quy ( khng cha lnh gi n P). f(X) l hm ca X. Tin trnh thc hin th tc P(X) l: + Nu C(X) ng th thc hin D(X). + Cn khng (C(X) sai ) th thc hin A(X); gi P(f(X)); thc hin B(X). ( B(X) ch thc hin khi P(f(X)) thc hin xong). Mi ln thnh phn quy P(Y) c g th thng tin gii thut B(Y) li c sinh ra (nhng cha thc hin). Gi s qu kh qu trnh quy kt thc sau k ln gi quy th ta phi thc hin mt dy k thao tc B theo th t: B(fk -1 (X)) , B(fk -2 (X)) , . . . ,B(f(f(X))) ,B(f(X)),B(X). thc hin dy thao tc { B(fi (X)) } theo th t ngc vi th t pht sinh ta cn dy d liu { fi (X) } { X , f(X) , f(f(X)) , . . . , fi(X) , . . . , fx -1 (X) } Trnh t thc hin P(X) c din t bng m hnh sau:

Gii thut thc hin P(X) vi vic s dng Stack c dng: P(X) { Creat_Stack (S) ; ( to stack S ) While( not (C(X)) { A(X) ; Push(S,X) ; ( ct gi tr X vo stack S ) X = f(X) ; } D(X) ; While(not(EmptyS(S))) { POP(S,X) ; ( ly d liu t S ) B(X) ;

} V d: Th tc quy chuyn biu din s t c s thp phn sang nh phn c dng: Binary(m) if ( m > 0 ) { Binary( m / 2 ) ; cout<< ( m % 2 ) ; } Trong trng hp ny: X l m. P(X) l Binary(m). A(X); D(X) l lnh rng. B(X) l lnh Write(m %2); C(X) l (m <= 0). f(X) = f(m) = m / 2. Gii thut thc hin Binary(m) khng quy l: Binary(m) { Creat_Stack (S) ; While ( m > 0 ) { sdu = m / 2 ; Push(S,sdu) ; m=m/2; }

While( not(EmptyS(S)) { POP(S,sdu) ; cout<< sdu ; } c. Nhiu lnh gi quy trc tip. v Th tc quy vi 2 ln gi trc tip Th tc quy 2 ln gi trc tip c dng: P(X) if C(X) { D(X) ; } else { A(X) ; P(f(X)) ; B(X) ; P(g(X)) ; } Qu trnh thc hin th tc P(X) s l: - Nu C(X) ng th thc hin D(X). - Nu C(X) sai th thc hin A(X); gi P(f(X)); thc hin B(X); gi P(g(X)), khi gi P(g(X)) th li pht sinh lnh A(g(X)) nh vy ngoi vic phi lu vo stack cc gi tr fi (X) ta cn phi lu vo stack cc gi tr gi(X) tng ng. Khi ta ly d liu t stack thc hin lnh B(U) vo stack, iu kin dng l khi truy xut ti phn t lu u tin trong stack. Thut ton kh quy tng ng vi th tc quy P(X) l: { Creat_Stact (S) : Push (S, (X,1)) ;

While ( not C(X) ) { A(X) ; Push (S, (X,2)) ; X = f(X) ; } D(X) ; POP (S, (X,k)) ; if ( k != 1) { B(X) ; X = g(X) ; } until ( k = 1 ) ; } V d: Kh quy th tc Thp H Ni. - Dng quy th tc Thp H N l: THN(n , X , Y, Z ) if( n > 0 ) { THN ( n 1 , X , Z , Y ) ; Move ( X , Z ) ; THN ( n 1 , Y , X , Z ) ;

} Vi n l s a, X l ct u, Z l ct cui, Y l ct gia, Move(X, Z) l cc thao tc chuyn 1 a t ct X ti ct Z. Trong trng hp ny: X l b (n, X, Y, Z). C(X) l biu thc boolean (n <= 0). D(X), A(X) l thao tc rng. B(X) = B(n, X, Y, Z) l thao tc Move(X, Z). g(X) = g(n, X, Y, Z) = (n -1, Y, X, Z). Gii thut khng quy tng ng l: { Creat_Stack (S) ; Push (S ,(n,X,Y,Z,1)) ; While ( n > 0 ) { Push (S ,(n,X,Y,Z,2)) ; n=n1; Swap (Y,Z ) ; //(* Swap(a, b) l th tc hon i ni dung 2 bin a, b) } POP (S,(n,X,Y,Z,k)) ; if ( k != 1 ) {

Move (X ,Z ) ; n=n1; Swap (X ,Y ) ; } until ( k = 1 ) ; } v Trng hp n ln gi quy trc tip. Th tc quy trong trng hp ny c dng: P(X) if ( C(X)) { D(X) } else { A1(X) ; P(f1(X)) ; A2(X) ; P(f2(X)) ; . Ai(X) ; P(fi(X)) ; . An(X) ; P(fn(X)) ; An+1(X) ; } V d: Kh quy cho th tc hon v.

+ Th tc hon v di dng quy: HOAN_VI(V ,n) if (n = 1 ) cout<< V ; else for ( int i =1; i<= n; i++ ) { Swap (V[n],V[i] ) ; HOAN_VI(V ,n 1) : } Trong trng hp ny: X l (V, n). // Vector V v s nguyn n. C(X) l (n =1). D(X) l cout<<V. // xut vector V. Ai(X) l th tc Swap(V[n], V[i]) . // (i = 1 n) An + 1 l thao tc rng. Dng Khng quy ca th tc l: { Creat_Stack (S) ; Push (S,(V ,n ,1)) ; While ( n > 1 ) { Swap(V[n] ,V[1] ; Push (S ,V , n ,2) ; n ;

} cout<<V ; POP (S ,(V ,n ,k)) ; While ( k = n +1 ) { POP(S ,(V ,n ,k) ; if(k !=1 ) { Swap(V[n] ,V[k]) ; Push (S ,(V ,n ,k+1) ; n ; } until(k = 1 ) ; } V. Ti Liu Tham Kho - Gio trnh k thut lp trnh nng cao Trn Hong Th nm 2002 - T in Bch khoa ta th m Wikipedia http://vi.wikipedia.org/wiki/_qui http://en.wikipedia.org/wiki/Recursi

You might also like