SlideShare a Scribd company logo
TRƖƔƘNG ƑAƏI HOƏC ƑAƘ LAƏT
GIAƙO TRƌNH
KYƕ THUAƄT LAƄP TRƌNH
NAƂNG CAO
TRAƀN HOAƘNG THOƏ
2002
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 2 -
MUƏC LUƏC
LƔƘI NOƙI ƑAƀU ........................................................................................................................4
PHAƀN I....................................................................................................................................5
CHƖƔNG I .............................................................................................................................5
I. MƔƛ ƑAƀU ...........................................................................................................................5
1. MoĆ¢ taĆ» ƱeƤ quy................................................................................................................5
2. CaĆ¹c loaĆÆi ƱeƤ quy ............................................................................................................6
II. MOƂ TAƛ ƑEƄ QUY CAƙC CAƁU TRUƙC DƖƕ LIEƄU...................................................................7
III. MOƂ TAƛ ƑEƄ QUY GIAƛI THUAƄT........................................................................................7
1. Giaƻi thuaƤt ƱeƤ quy..........................................................................................................7
2. ChƶƓng trƬnh con ƱeƤ quy..............................................................................................8
3. MaƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ qui trong caĆ¹c ngoĆ¢n ngƶƵ laƤp trƬnh. .............................................11
4. MoƤt soĆ” daĆÆng giaĆ»i thuaƤt ƱeƤ quy ƱƓn giaĆ»n thƶƓĆøng gaĆ«p . ..............................................13
CHƖƔNG II ...........................................................................................................................16
I. CAƙC NOƄI DUNG CAƀN LAƘM ƑEƅ TƌM GIAƛI THUAƄT ƑEƄ QUY CHO MOƄT BAƘI TOAƙN. .....16
1. ThoĆ¢ng soĆ” hoaĆ¹ baĆøi toaĆ¹n...............................................................................................16
2. PhaĆ¹t hieƤn caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n (neo) vaĆø tƬm giaĆ»i thuaƤt cho caĆ¹c trƶƓĆøng hĆ“ĆÆp naĆøy.16
3. PhaĆ¢n raƵ baĆøi toaĆ¹n toĆ„ng quaĆ¹t theo phƶƓng thĆ¶Ć¹c ƱeƤ quy. ..............................................16
II. MOƄT SOƁ BAƘI TOAƙN GIAƛI BAƈNG GIAƛI THUAƄT ƑEƄ QUY ƑIEƅN HƌNH...........................17
1. BaĆøi toaĆ¹n thaĆ¹p HaĆø NoƤi . ...............................................................................................17
2. BaĆøi toaĆ¹n chia thƶƓƻng. .................................................................................................19
3. BaĆøi toaĆ¹n tƬm taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² cuĆ»a moƤt daƵy phaĆ n tƶƻ.................................................21
4. BaĆøi toaĆ¹n saĆ©p xeĆ”p maĆ»ng baĆØng phƶƓng phaĆ¹p troƤn (Sort-Merge)..................................24
5. BaĆøi toaĆ¹n tƬm nghieƤm xaĆ”p xƦ cuĆ»a phƶƓng trƬnh f(x)=0 . ...............................................25
CHƖƔNG III ..........................................................................................................................28
I. CƔ CHEƁ THƖƏC HIEƄN GIAƛI THUAƄT ƑEƄ QUY................................................................28
II. TOƅNG QUAN VEƀ VAƁN ƑEƀ KHƖƛƻ ƑEƄ QUY.....................................................................32
III. CAƙC TRƖƔƘNG HƔƏP KHƖƛ ƑEƄ QUY ƑƔN GIAƛN. .........................................................33
1. CaĆ¹c trƶƓĆøng hĆ“ĆÆp khƶƻ ƱeƤ quy baĆØng voĆøng laĆ«p . ............................................................33
2. Khƶƻ ƱeƤ quy haĆøm ƱeƤ quy arsac..................................................................................41
3. Khƶƻ ƱeƤ quy moƤt soĆ” daĆÆng thuĆ» tuĆÆc ƱeƤ quy thƶƓĆøng gaĆ«p. ...............................................45
PhaĆ n II ..................................................................................................................................52
CHƖƔNG IV..........................................................................................................................52
I. CAƙC GIAI ƑOAƏN TRONG CUOƄC SOƁNG CUƛA MOƄT PHAƀN MEƀM .................................52
1) ƑaĆ«c taĆ» baĆøi toaĆ¹n ..........................................................................................................52
2) XaĆ¢y dƶĆÆng heƤ thoĆ”ng ....................................................................................................52
3) Sƶƻ duĆÆng vaĆø baĆ»o trƬ heƤ thoĆ”ng ......................................................................................53
II. ƑAƋC TAƛ.........................................................................................................................53
1. ƑaĆ«c taĆ» baĆøi toaĆ¹n...........................................................................................................53
2. ƑaĆ«c taĆ» chƶƓng trƬnh (ƑTCT).......................................................................................54
3. ƑaĆ«c taĆ» ƱoaĆÆn chƶƓng trƬnh ..........................................................................................55
III. NGOƂN NGƖƕ LAƄP TRƌNH..............................................................................................57
CHƖƔNG V..........................................................................................................................59
I. CAƙC KHAƙI NIEƄM VEƀ TƍNH ƑUƙNG. ................................................................................59
II. HEƄ LUAƄT HOARE (HOARES INFERENCE RULES). ...................................................59
1. CaĆ¹c luaƤt heƤ quaĆ» (Consequence rules) .......................................................................60
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 3 -
2. TieĆ¢n ƱeĆ  gaĆ¹n (The Assignement Axiom) .....................................................................61
3. CaĆ¹c luaƤt veĆ  caĆ¹c caĆ”u truĆ¹c ƱieĆ u khieĆ„n . ........................................................................61
III. KIEƅM CHƖƙNG ƑOAƏN CHƖƔNG TRƌNH KHOƂNG COƙ VOƘNG LAƋP. .............................64
IV. KIEƅM CHƖƙNG ƑOAƏN CHƖƔNG TRƌNH COƙ VOƘNG LAƋP............................................68
1. BaƔt bieƔn......................................................................................................................68
2. LyĆ¹ luaƤn quy naĆÆp vaĆø chĆ¶Ć¹ng minh baĆØng quy naĆÆp..........................................................70
3. KieĆ„m chĆ¶Ć¹ng chƶƓng trƬnh coĆ¹ voĆøng laĆ«p while. .............................................................71
CHƖƔNG VI.........................................................................................................................76
I. CAƙC KHAƙI NIEƄM...........................................................................................................76
1. ƑaĆ«t vaĆ”n ƱeĆ . ................................................................................................................76
2. Ć‘Ć²nh nghĆ³a WP(S,Q)...................................................................................................76
3. HeƤ quaĆ» cuĆ»a Ć±Ć²nh nghĆ³a...............................................................................................76
4. CaĆ¹c vĆ­ duĆÆ....................................................................................................................77
II. TƍNH CHAƁT CUƛA WP....................................................................................................77
III. CAƙC PHEƙP BIEƁN ƑOƅI TAƂN TƖƘ....................................................................................78
1. ToaĆ¹n tƶƻ gaĆ¹n (tieĆ¢n ƱeĆ  gaĆ¹n). .........................................................................................78
2. ToaĆ¹n tƶƻ tuaĆ n tƶĆÆ...........................................................................................................78
3. ToaĆ¹n tƶƻ ƱieĆ u kieƤn. ......................................................................................................79
4. ToaĆ¹n tƶƻ laĆ«p.................................................................................................................80
IV. LƖƔƏC ƑOƀ KIEƅM CHƖƙNG HƔƏP LYƙ VAƘ CAƙC ƑIEƀU KIEƄN CAƀN KIEƅM CHƖƙNG............84
1. LƶƓĆÆc ƱoĆ  kieĆ„m chĆ¶Ć¹ng. .................................................................................................84
2. KieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng................................................................................................85
3. TaƤp toĆ”i tieĆ„u caĆ¹c ƱieĆ u kieƤn caĆ n kieĆ„m chĆ¶Ć¹ng. ...............................................................93
PHU LUƏC ..............................................................................................................................96
I. LOGIC TOAƙN..................................................................................................................96
II. LOGIC MEƄNH ƑEƀ..........................................................................................................96
1. PhaĆ¢n tĆ­ch....................................................................................................................96
2. CaĆ¹c lieĆ¢n tƶĆø logic. ........................................................................................................97
3. YƙnghĆ³a cuĆ»a caĆ¹c lieĆ¢n tƶĆø Logic. BaĆ»ng chaĆ¢n trĆ². .............................................................97
4. LyĆ¹ luaƤn ƱuĆ¹ng. .............................................................................................................98
5. TƶƓng ƱƶƓng (Equivalence)......................................................................................99
6. TĆ­nh thay theĆ”, tĆ­nh truyeĆ n vaĆø tĆ­nh ƱoĆ”i xĆ¶Ć¹ng...............................................................100
7. BaĆøi toaĆ¹n suy dieĆ£n logic.........................................................................................100
8. CaĆ¹c luaƤt suy dieĆ£n (rules of inference). .....................................................................102
III. LOGIC TAƂN TƖƘ. .........................................................................................................103
1. KhaĆ¹i nieƤm.................................................................................................................103
2. CaĆ¹c lƶƓĆÆng tƶĆø logic ....................................................................................................105
3. TaƤp hĆ“ĆÆp vaĆø taĆ¢n tƶƘ.....................................................................................................107
4. CaĆ¹c lƶƓĆÆng tƶĆø soĆ” hoĆÆc.................................................................................................107
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 4 -
LƔƘI NOƙI ƑAƀU
GiaĆ¹o trƬnh ƱƶƓĆÆc vieĆ”t theo noƤi dung moĆ¢n hoĆÆc ā€œ KyƵ thuaƤt laƤp trƬnh naĆ¢ng caoā€ vĆ“Ć¹i muĆÆc
Ʊƭch laĆøm taĆøi lieƤu tham khaĆ»o chĆ­nh cho moĆ¢n hoĆÆc.
GiaĆ¹o trƬnh goĆ m 2 phaĆ n chĆ­nh vaĆø moƤt phuĆÆ luĆÆc :
PhaƠn I. ƑeƤ quy.
TrƬnh baĆøy veĆ  chuĆ» ƱeĆ  ƱeƤ quy trong laƤp trƬnh bao goĆ m caĆ¹c noƤi dung sau :
- KhaĆ¹i nieƤm ƱeƤ quy vaĆø vai troĆø cuĆ»a noĆ¹ trong laƤp trƬnh.
- CaĆ¹ch xaĆ¢y dƶĆÆng moƤt giaĆ»i thuaƤt cho moƤt baĆøi toaĆ¹n baĆØng phƶƓng phaĆ¹p ƱeƤ quy.
- CĆ“ cheĆ” thƶĆÆc hieƤn moƤt giaĆ»i thuaƤt ƱeƤ quy.
- Khƶƻ ƱeƤ quy.
PhaĆ n II. KieĆ„m chĆ¶Ć¹ng chƶƓng trƬnh.
TrƬnh baĆøy veĆ  chuĆ» ƱeĆ  kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng cuĆ»a chƶƓng trƬnh bao goĆ m caĆ¹c noƤi dung
sau:
- Vai troĆø cuĆ»a vaĆ”n ƱeĆ  kieĆ„m chĆ¶Ć¹ng trong laƤp trƬnh.
- CaĆ¹c phƶƓng phaĆ¹p duĆøng ƱeĆ„ kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng .
- HeƤ luaƤt Hoare vaĆø aĆ¹p duĆÆng cuĆ»a noĆ¹ vaĆøo kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng coĆ¹ ƱieĆ u kieƤn.
- HeƤ luaƤt Dijkstra vaĆø aĆ¹p duĆÆng cuĆ»a noĆ¹ vaĆøo kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng ƱaĆ y ƱuĆ».
- DaĆÆng toĆ„ng quaĆ¹t cuĆ»a baĆøi toaĆ¹n kieĆ„m chĆ¶Ć¹ng vaĆø phƶƓng phaĆ¹p kieĆ„m chĆ¶Ć¹ng. CaĆ¹c lƶƓĆÆc
ƱoĆ  kieĆ„m chĆ¶Ć¹ng vaĆø taƤp toĆ”i thieĆ„u caĆ¹c ƱieĆ u kieƤn caĆ n kieĆ„m chĆ¶Ć¹ng.
PhuĆÆ luĆÆc . CaĆ¹c kieĆ”n thĆ¶Ć¹c chung veĆ  logic.
TrƬnh baĆøy caĆ¹c kieĆ”n thĆ¶Ć¹c ban ƱaĆ u veĆ  logic meƤnh ƱeĆ  vaĆø logic taĆ¢n tƶĆø. PhuĆÆ luĆÆc cung caĆ”p
moƤt moƤt taĆøi lieƤu coĆ¢ ƱoĆÆng veĆ  caĆ¹c kieĆ”n thĆ¶Ć¹c logic aĆ¹p duĆÆng trƶĆÆc tieĆ”p trong phaĆ n I vaĆø phaĆ n
II ( noĆ¹ laĆø moƤt phaĆ n noĆ¢i dung cuĆ»a giaĆ¹o trƬnh nhaƤp moĆ¢n toaĆ¹n) ngƶƓĆøi hoĆÆc caĆ n daĆønh thĆ“Ćøi
gian thĆ­ch hĆ“ĆÆp oĆ¢n laĆÆi ƱeĆ„ coĆ¹ theĆ„ theo kĆ²p hĆ¶Ć“Ć¹ng tieĆ”p caƤn cuĆ»a giaĆ¹o trƬnh.
CuĆøng vĆ“Ć¹i nhƶƵng trƬnh baĆøy lyĆ¹ thuyeĆ”t toĆ„ng quaĆ¹t, taĆ¹c gƦa Ʊƶa vaĆøo moƤt soĆ” thoĆ»a ƱaĆ¹ng caĆ¹c
vĆ­ duĆÆ choĆÆn loĆÆc nhaĆØm giuĆ¹p ngƶƓĆøi hoĆÆc naĆ©m baĆ©t ƱƶƓĆÆc baĆ»n chaĆ”t cuĆ»a caĆ¹c khaĆ¹i nieƤm, caĆ¹c
phƶƓng phaĆ¹p mĆ“Ć¹i vaĆø laĆøm quen vĆ“Ć¹i caĆ¹ch sƶƻ duĆÆng caĆ¹c keĆ”t quĆ»a mĆ“Ć¹i. Khi hoĆÆc trĆ¶Ć“Ć¹c khi tƬm
caĆ¹ch giaĆ»i caĆ¹c baĆøi taƤp cuĆ»a thaĆ y gĆ­ao cung caĆ”p caĆ¹c baĆÆn coĆ” gaĆ©ng ƱoĆÆc vaĆø hieĆ„u heĆ”t caĆ¹c vĆ­ duĆÆ
minh hoĆÆa.
VƬ nhieĆ u leƵ chaĆ©c chaĆ©n giaĆ¹o trƬnh coĆøn nhieĆ u khieĆ”m khuyeĆ”t. RaĆ”t mong taĆ”t caĆ» moĆÆi
ngƶƓĆøi sƶƻ duĆÆng chaĆ¢n thaĆønh goĆ¹p yĆ¹.
TaĆ¹c giaĆ» chaĆ¢n thaĆønh caĆ»m Ć“n caĆ¹c ƱoĆ ng nghieƤp trong khoa ToaĆ¹n_Tin ƱaƵ ƱoĆ¹ng goĆ¹p
nhieĆ u yĆ¹ kieĆ”n quyĆ¹ baĆ¹u cho vieƤc hƬnh thaĆønh caĆ”u truĆ¹c chi tieĆ”t cho noƤi dung giaĆ¹o trƬnh,
chaĆ¢n thaĆønh caĆ»m Ć“n thaĆÆc syƵ VoƵ TieĆ”n ƱaƵ ƱoĆ¹ng goĆ¹p nhieĆ u yĆ¹ kieĆ”n quyĆ¹ baĆ¹u trong caĆ”u truĆ¹c
giaĆ¹o trƬnh, giuĆ¹p chƦnh lyĆ¹ nhieĆ u khieĆ”m khuyeĆ”t trong baĆ»n thaĆ»o.
ƑaLat ngaĆøy 01 thaĆ¹ng 12 naĆŖm 2002
TRAƀN HOAƘNG THOƏ
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 5 -
PHAƀN I
ƑEƄ QUY
CHƖƔNG I
KHAƙI NIEƄM ƑEƄ QUY
I. MƔƛ ƑAƀU
1. MoĆ¢ taĆ» ƱeƤ quy
Trong nhieĆ u tƬnh huoĆ”ng vieƤc moĆ¢ taĆ» caĆ¹c baĆøi toaĆ¹n, caĆ¹c giaĆ»i thuaƤt, caĆ¹c sƶĆÆ kieƤn, caĆ¹c sƶĆÆ
vaƤt caĆ¹c quaĆ¹ trƬnh, caĆ¹c caĆ”u truĆ¹c, . . . seƵ ƱƓn giaĆ»n vaĆø hieƤu quaĆ» hĆ“n neĆ”u ta nhƬn ƱƶƓĆÆc noĆ¹
dĆ¶Ć“Ć¹i goĆ¹c ƱoƤ mang tĆ­nh ƱeƤ qui.
MoĆ¢ taĆ» mang tĆ­nh ƱeƤ qui veĆ  moƤt ƱoĆ”i tƶƓĆÆng laĆø moĆ¢ taĆ» theo caĆ¹ch phaĆ¢n tĆ­ch ƱoĆ”i tƶƓĆÆng
thaĆønh nhieĆ u thaĆønh phaĆ n maĆø trong soĆ” caĆ¹c thaĆønh phaĆ n coĆ¹ thaĆønh phaĆ n mang tĆ­nh chaĆ”t cuĆ»a
chĆ­nh ƱoĆ”i tƶƓĆÆng ƱƶƓĆÆc moĆ¢ taĆ». TĆ¶Ć¹c laĆø moĆ¢ taĆ» ƱoĆ”i tƶƓĆÆng qua chĆ­nh noĆ¹.
CaĆ¹c vĆ­ duĆÆ :
- MoĆ¢ taĆ» ƱeƤ quy taƤp soĆ” tƶĆÆ nhieĆ¢n N :
+ SoĆ” 1 laĆø soĆ” tƶĆÆ nhieĆ¢n ( 1 āˆˆ N) .
+ SoĆ” tƶĆÆ nhieĆ¢n baĆØng soĆ” tƶĆÆ nhieĆ¢n coƤng 1 .
( n āˆˆ N ā‡’ ( n +1 ) āˆˆ N )
- MoĆ¢ taĆ» ƱeƤ quy caĆ”u truĆ¹c xaĆ¢u (list) kieĆ„u T :
+ CaĆ”u truĆ¹c roĆ£ng laĆø moƤt xaĆ¢u kieĆ„u T.
+ GheĆ¹p noĆ”i moƤt thaĆønh phaĆ n kieĆ„u T(nuĆ¹t kieĆ„u T ) vĆ“Ć¹i moƤt xaĆ¢u kieĆ„u T ta coĆ¹ moƤt
xaĆ¢u kieĆ„u T.
- MoĆ¢ taĆ» ƱeƤ quy caĆ¢y gia phaĆ» : Gia phaĆ» cuĆ»a moƤt ngƶƓĆøi bao goĆ m mgƶƓĆøi ƱoĆ¹ vaĆø gia phaĆ»
cuĆ»a cha vaĆø gia phaĆ» cuĆ»a meĆÆ.
- MoĆ¢ taĆ» ƱeĆ¢ quy thuĆ» tuĆÆc choĆÆn hoa haƤu :
+ ChoĆÆn hoa haƤu cuĆ»a tƶĆøng khu vƶĆÆc.
+ ChoĆÆn hoa haƤu cuĆ»a caĆ¹c hoa haƤu.
- MoĆ¢ taĆ» ƱeƤ quy thuĆ» tuĆÆc saĆ©p taĆŖng daƵy a[m:n] ( daƵy a[m], a[m+1], . . . , a[n] ) baĆØng
phƶƓng phaĆ¹p Sort_Merge (SM) :
SM (a[m:n]) ā‰” Merge ( SM(a[m : (n+m) div 2]) , SM (a[(n+m) div 2 +1 : n] )
VĆ“Ć¹i : SM (a[x : x]) laĆø thao taĆ¹c roĆ£ng (khoĆ¢ng laĆøm gƬ caĆ» ).
Merge (a[x : y] , a[(y+1) : z]) laĆø thuĆ» tuĆÆc troƤn 2 daƵy taĆŖng a [x : y] , a[(y+1) :
z] ƱeĆ„ ƱƶƓĆÆc moƤt daƵy a[x : z] taĆŖng.
- Ƒinh nghĆ³a ƱeƤ quy haĆøm giai thƶĆøa FAC( n) = n !
0 ! = 1
n ! = n * ( n - 1 ) !
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 6 -
PhƶƓng phaĆ¹p ƱeƤ quy maĆÆnh Ć“Ć» choĆ„ noĆ¹ cho pheĆ¹p moĆ¢ taĆ» moƤt taƤp lĆ“Ć¹n caĆ¹c ƱoĆ”i tƶƓĆÆng chƦ bĆ“Ć»i
moƤt soĆ” Ć­t caĆ¹c meƤnh ƱeĆ  hoaĆ«c moĆ¢ taĆ» moƤt giaĆ»i thuaƤt phĆ¶Ć¹c taĆÆp baĆØng moƤt soĆ” Ć­t caĆ¹c thao taĆ¹c
(moƤt chƶƓng trƬnh con ƱeƤ quy).
MoƤt moĆ¢ taĆ» ƱeƤ quy ƱaĆ y ƱuĆ» goĆ m 2 phaĆ n :
- PhaĆ n neo : moĆ¢ taĆ» caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n cuĆ»a ƱoĆ”i tƶƓĆÆng (giaĆ»i thuaƤt) qua moƤt
caĆ”u truĆ¹c (thao taĆ¹c) cuĆÆ theĆ„ xaĆ¹c Ć±Ć²nh .
vĆ­ duĆÆ: 1 laĆø soĆ” tƶĆÆ nhieĆ¢n, caĆ”u truĆ¹c roĆ£ng laĆø moƤt xaĆ¢u kieĆ„u T, 0 ! = 1 , SM (a[x:x])
laĆø thao taĆ¹c roĆ£ng.
- PhaĆ n quy naĆÆp: moĆ¢ taĆ» ƱoĆ”i tƶƓĆÆng (giaĆ»i thuaƤt) trong trƶƓĆøng hĆ“ĆÆp phoĆ„ bieĆ”n thoĆ¢ng qua
chĆ­nh ƱoĆ”i tƶƓĆÆng (giaĆ»i thuaƤt ) ƱoĆ¹ moƤt caĆ¹ch trƶĆÆc tieĆ”p hoaĆ«c giaĆ¹n tieĆ”p.
VĆ­ duĆÆ : n! = n * (n ā€“ 1) !
SM (a[m:n]) ā‰” Merge (SM (a[m:( m+n) div 2] , SM (a[(m+n) div 2 +1 : n]) )
NeĆ”u trong moĆ¢ taĆ» khoĆ¢ng coĆ¹ phaĆ n neo thƬ ƱoĆ”i tƶƓĆÆng moĆ¢ taĆ» coĆ¹ caĆ”u truĆ¹c lĆ“Ć¹n voĆ¢ haĆÆn, giaĆ»i
thuaƤt moĆ¢ taĆ» trĆ“Ć» thaĆønh caĆ”u truĆ¹c laĆ«p voĆ¢ taƤn.
2. CaĆ¹c loaĆÆi ƱeƤ quy
NgƶƓĆøi ta phaĆ¢n ƱeƤ quy thaĆønh 2 loaĆÆi : ƑeƤ quy trƶĆÆc tieĆ”p, ƱeƤ quy giaĆ¹n tieĆ”p.
- ƑeƤ quy trƶĆÆc tieĆ”p laĆø loaĆÆi ƱeƤ quy maĆø ƱoĆ”i tƶƓĆÆng ƱƶƓĆÆc moĆ¢ taĆ» trƶĆÆc tieĆ”p qua noĆ¹ :
A moĆ¢ taĆ» qua A, B, C,...trong ƱoĆ¹ B, C, ... khoĆ¢ng chĆ¶Ć¹a A. (caĆ¹c vĆ­ duĆÆ treĆ¢n).
- ƑeƤ quy giaĆ¹n tieĆ”p laĆø loaĆÆi ƱeƤ quy maĆø ƱoĆ”i tƶƓĆÆng ƱƶƓĆÆc moĆ¢ taĆ» giaĆ¹n tieĆ”p qua noĆ¹ :
A moĆ¢ taĆ» qua A1 ,A2 ,..., An .Trong ƱoĆ¹ coĆ¹ moƤt Ai ƱƶƓĆÆc moĆ¢ taĆ» qua A.
VĆ­ duĆÆ 1:
MoĆ¢ taĆ» daĆÆng toĆ„ng quaĆ¹t moƤt chƶƓng trƬnh vieĆ”t treĆ¢n NNLT Pascal :
MoƤt ChƶƓng trƬnh Pascal goƠm :
a) ƑaĆ u chƶƓng trƬnh (head) goĆ m: Program TeĆ¢n ;
b) ThaĆ¢n chƶƓng trƬnh (blok) goĆ m :
b1) Khai baĆ¹o unit, Ć±Ć²nh nghĆ³a haĆØng, nhaƵn, kieĆ„u dƶƵ lieƤu, khaĆ¹i baĆ¹o bieĆ”n.
b2) Ć‘Ć²nh nghĆ³a caĆ¹c chƶƓng trƬnh con goĆ m :
b2.1) ƑaĆ u chƶƓng trƬnh con :
Procedure TeĆ¢n thuĆ» tuĆÆc ( danh saĆ¹ch thoĆ¢ng soĆ” hƬnh thĆ¶Ć¹c ) ;
hoaĆ«c Function TeĆ¢n haĆøm ( danh saĆ¹ch thoĆ¢ng soĆ” hƬnh thĆ¶Ć¹c ) : KieĆ„u ;
b2.2) ThaĆ¢n chƶƓng trƬnh con ( Blok )
b2.3) DaĆ”u ā€˜ ; ā€˜
b3) PhaĆ n leƤnh : laĆø moƤt leƤnh gheĆ¹p daĆÆng :
Begin S1 ; S2 ; . . . ; Sn End ;
c) DaĆ”u keĆ”t thuĆ¹c chƶƓng trƬnh : ā€˜.ā€™
VĆ­ duĆÆ 2 : MoĆ¢ taĆ» hai daƵy soĆ” {Xn},{Yn} theo luaƤt ƱeƤ quy hoĆ„ tƶƓng nhƶ sau :
X0 = 1 ; Xn = Xn-1 + Yn-1 ;
Y0 = 1 ; Yn =n2
Xn-1 + Yn-1 ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 7 -
II. MOƂ TAƛ ƑEƄ QUY CAƙC CAƁU TRUƙC DƖƕ LIEƄU
Trong toaĆ¹n hoĆÆc , trong laƤp trƬnh ngƶƓĆøi ta thƶƓĆøng sƶƻ duĆÆng ƱeƤ quy ƱeĆ„ moĆ¢ taĆ» caĆ¹c
caĆ”u truĆ¹c phĆ¶Ć¹c taĆÆp, coĆ¹ tĆ­nh ƱeƤ quy . BĆ“Ć»i moĆ¢ taĆ» ƱeƤ quy khoĆ¢ng chƦ laĆø caĆ¹ch moĆ¢ taĆ» ngaĆ©n goĆÆn
caĆ¹c caĆ”u truĆ¹c phĆ¶Ć¹c taĆÆp maĆø coĆøn taĆÆo khaĆ» naĆŖng ƱeĆ„ xaĆ¢y dƶĆÆng caĆ¹c thao taĆ¹c xƶƻ lyĆ¹ treĆ¢n caĆ¹c caĆ”u
truĆ¹c phĆ¶Ć¹c taĆÆp baĆØng caĆ¹c giaĆ»i thuaƤt ƱeƤ qui . MoƤt caĆ”u truĆ¹c dƶƵ lieƤu coĆ¹ tĆ­nh ƱeƤ quy thƶƓĆøng
goĆ m moƤt soĆ” thaĆønh phaĆ n dƶƵ lieƤu cuĆøng kieĆ„u ƱƶƓĆÆc gheĆ¹p noĆ”i theo cuĆøng moƤt phƶƓng thĆ¶Ć¹c .
VĆ­ duĆÆ 1:
MoĆ¢ taĆ» ƱeƤ quy caĆ¢y nhi phaĆ¢n :
CaĆ¢y nhi phaĆ¢n kieĆ„u T :
+ HoaĆ«c laĆø moƤt caĆ”u truĆ¹c roĆ£ng (phaĆ n neo).
+ HoaĆ«c laĆø moƤt nuĆ¹t kieĆ„u T (nuĆ¹t goĆ”c) vaĆø 2 caĆ¢y nhĆ² phaĆ¢n kieĆ„u T rĆ“Ćøi nhau (caĆ¢y
con nhĆ² phaĆ¢n phaĆ»i, caĆ¢y con nhĆ² phaĆ¢n traĆ¹i) keĆ”t hĆ“ĆÆp vĆ“Ć¹i nhau .
VĆ­ duĆÆ 2:
MoĆ¢ taĆ» ƱeƤ quy maĆ»ng nhieĆ u chieĆ u :
+ MaĆ»ng moƤt chieĆ u laĆø daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ caĆ¹c thaĆønh phaĆ n cuĆøng kieĆ„u .
+ MaĆ»ng n chieĆ u laĆø maĆ»ng 1 chieĆ u maĆø caĆ¹c thaĆønh phaĆ n coĆ¹ kieĆ„u maĆ»ng n-1 chieĆ u .
III. MOƂ TAƛ ƑEƄ QUY GIAƛI THUAƄT
1. Giaƻi thuaƤt ƱeƤ quy.
GiaĆ»i thuaƤt ƱeƤ quy laĆø giaĆ»i thuaƤt coĆ¹ chĆ¶Ć¹a thao taĆ¹c goĆÆi ƱeĆ”n noĆ¹ . GiaĆ»i thuaƤt ƱeƤ quy cho
pheĆ¹p moĆ¢ taĆ» moƤt daƵy lĆ“Ć¹n caĆ¹c thao taĆ¹c baĆØng moƤt soĆ” Ć­t caĆ¹c thao taĆ¹c trong ƱoĆ¹ coĆ¹ chĆ¶Ć¹a thao
taĆ¹c goĆÆi laĆÆi giaĆ»i thuaƤt (goĆÆi ƱeƤ quy) .
MoƤt caĆ¹ch toĆ„ng quaĆ¹t moƤt giaĆ»i thuaƤt ƱeƤ quy ƱƶƓĆÆc bieĆ„u dieĆ£n nhƶ moƤt boƤ P goĆ m meƤnh
ƱeĆ  S (khoĆ¢ng chĆ¶Ć¹a yeĆ”u toĆ” ƱeƤ quy ) vaĆø P : P ā‰” P[ S , P ] .
ThƶĆÆc thi giaĆ»i thuaƤt ƱeƤ quy coĆ¹ theĆ„ daĆ£n tĆ“Ć¹i moƤt tieĆ”n trƬnh goĆÆi ƱeĆ¢ quy khoĆ¢ng keĆ”t thuĆ¹c
khi noĆ¹ khoĆ¢ng coĆ¹ khaĆ» naĆŖng gaĆ«p trƶƓĆøng hĆ“ĆÆp neo, vƬ vaƤy quan taĆ¢m ƱeĆ”n ƱieĆ u kieƤn dƶĆøng
cuĆ»a moƤt giaĆ»i thuaƤt ƱeƤ quy luoĆ¢n ƱƶƓĆÆc ƱaĆ«t ra . ƑeĆ„ kieĆ„m soaĆ¹t quĆ¹a trƬnh goĆÆi ƱeƤ quy cuĆ»a
giaĆ»i thuaƤt ƱeƤ quy P ngƶƓĆøi ta thƶƓĆøng gaĆ©n thao taĆ¹c goĆÆi P vĆ“Ć¹i vieƤc kieĆ„m tra moƤt ƱieĆ u
kieƤn B xaĆ¹c Ć±Ć²nh vaĆø bieĆ”n ƱoĆ„i qua moĆ£i laĆ n goĆÆi P , quĆ¹a trƬnh goĆÆi P seĆ» dƶĆøng khi B khoĆ¢ng
con thoƻa.
MoĆ¢ hƬnh toĆ„ng quaĆ¹t cuĆ»a moƤt giaĆ»i thuaƤt ƱeƤ quy vĆ“Ć¹i sƶĆÆ quan taĆ¢m ƱeĆ”n sƶĆÆ dƶĆøng seĆ» laĆø :
P if B then P[ S , P ]ā‰”
hoaĆ«c P P[ S , if B then P ]ā‰”
ThoĆ¢ng thƶƓĆøng vĆ“Ć¹i giaĆ»i thuaƤt ƱeƤ quy P , ƱeĆ„ ƱaĆ»m baĆ»o P seĆ» dƶĆøng sau n laĆ n goĆÆi ta choĆÆn
B laĆø ( n >0 ) . MoĆ¢ hƬnh giaĆ»i thuaƤt ƱeƤ quy khi ƱoĆ¹ coĆ¹ daĆÆng :
P(n) If ( n > 0 ) then P[ S , P(n - 1)] ;ā‰”
hoaĆ«c P(n) P[ S , if (n >0) then P(n - 1) ] ;ā‰”
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 8 -
Trong caĆ¹c Ć¶Ć¹ng duĆÆng thƶĆÆc teĆ” soĆ” laĆ n goĆÆi ƱeƤ quy (ƱoƤ saĆ¢u ƱeƤ quy) khoĆ¢ng nhƶƵng phaĆ»i hƶƵu
haĆÆn maĆø coĆøn phaĆ»i ƱuĆ» nhoĆ» . BĆ“Ć»i vƬ moĆ£i laĆ n goĆÆi ƱeƤ quy seƵ caĆ n moƤt vuĆøng nhĆ“Ć¹ mĆ“Ć¹i trong khi
vuĆøng nhĆ“Ć¹ cuƵ vaĆ£n phaĆ»i duy trƬ .
2. ChƶƓng trƬnh con ƱeƤ quy.
a) CaĆ¹c haĆøm ƱeƤ quy.
Ć‘Ć²nh nghĆ³a haĆøm soĆ” baĆØng ƱeƤ quy thƶƓĆøng gaĆ«p trong toaĆ¹n hoĆÆc, ƱieĆ„n hƬnh laĆø caĆ¹c haĆøm
nguyeĆ¢n moĆ¢ taĆ» caĆ¹c daƵy soĆ” hoĆ i quy .
VĆ­ duĆÆ 1 .
DaƵy caĆ¹c giai thƶĆøa : { n! } ā‰” 1 ,1 , 2 , 6 , 24 , 120 , 720 , 5040 , . . .
KyĆ¹ hieƤu FAC(n ) = n ! .
Ta coĆ¹ : + FAC(0 ) = 1 ; ( 0 ! = 1 )
+ FAC(n ) = n * FAC(n - 1 ) ; ( n ! = n * (n - 1 ) ! ) vĆ“Ć¹i n >= 1
GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh FAC(n ) laĆø :
FAC(n ) if (n = 0 ) then return 1 ;ā‰”
else return (n * FAC(n - 1 )) ;
VĆ­ duĆÆ 2 .
DaƵy soƔ Fibonaci(FIBO) :
{ FIBO (n) } ā‰” 1 ,1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , . . .
+ FIBO(0 ) = FIBO (1 ) = 1 ;
+ FIBO(n ) = FIBO (n - 1 ) + FIBO ( n - 2 ) ; vĆ“Ć¹i n > = 2
GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh FIBO ( n ) laĆø :
FIBO(n) if ((n = 0 ) or ( n = 1 )) then return 1 ;ā‰”
else return ( FIBO (n - 1) + FIBO (n - 2)) ;
VĆ­ duĆÆ 3 . DaƵy caĆ¹c toĆ„ hĆ“ĆÆp :
1
1 2 1
1 3 3 1
1 4 6 4 1
C = 1 vĆ“Ć¹i n > = 0n
0
= 0 vĆ“Ć¹i m > n > 0Cn
m
vĆ“Ć¹i n > m > 0C C Cn
m
n
m
n
m
= +āˆ’
āˆ’
āˆ’1
1
1
GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh laĆø :Cn
m
if ( m = 0 ) then return 1 ;
else if (m > n ) then return 0 ;
else return ( ) ;C Cn
m
n
m
āˆ’
āˆ’
āˆ’+1
1
1
NhaƤn xeĆ¹t :
MoƤt Ć±Ć²nh nghĆ³a haĆøm ƱeƤ quy goĆ m :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 9 -
+ MoƤt soĆ” caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n maĆø gĆ­a trĆ² haĆøm taĆÆi ƱoĆ¹ ƱaƵ ƱƶƓĆÆc bieĆ”t trĆ¶Ć“Ć¹c hoaĆ«c
coĆ¹ theĆ„ tĆ­nh moƤt caĆ¹ch ƱƓn giaĆ»n (khoĆ¢ng ƱeƤ quy ) .
Nhƶ :
FAC(0 ) = 1 , FIBO(0) = FIBO(1) = 1 , = 1 , = 0 vĆ“Ć¹i m > n > 0 .Cn
0
Cn
m
+ TrƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t vieƤc tĆ­nh haĆøm seĆ» ƱƶƓc Ʊƶa veĆ  tĆ­nh haĆøm Ć“Ć» giaĆ¹ trĆ² ā€œ beĆ¹
hĆ“nā€ (gaĆ n vĆ“Ć¹i giaĆ¹ trĆ² neo) cuĆ»a ƱoĆ”i soĆ” .
Nhƶ :
FAC(n ) = n * FAC(n - 1 ) ;
FIBO(n) = FIBO(n -1) + FIBO( n - 2 ) .
Trong taƤp bieĆ”n cuĆ»a haĆøm coĆ¹ moƤt nhoĆ¹m maĆø ƱoƤ lĆ“Ć¹n cuĆ»a noĆ¹ quyeĆ”t Ć±Ć²nh ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a
vieƤc tĆ­nh gĆ­a trĆ² haĆøm . NhoĆ¹m bieĆ”n ƱoĆ¹ goĆÆi laĆø nhoĆ¹m bieĆ”n ƱieĆ u khieĆ„n . GĆ­a trĆ² bieĆ¢n cuĆ»a
nhoĆ¹m bieĆ”n ƱieĆ u khieĆ„n Ć¶Ć¹ng vĆ“Ć¹i trƶƓĆøng hĆ“ĆÆp suy bieĆ”n . GĆ­a trĆ² cuĆ»a nhoĆ¹m bieĆ”n ƱieĆ u khieĆ„n
seĆ» thay ƱoĆ„i qua moĆ£i laĆ n goĆÆi ƱeƤ quy vĆ“Ć¹i xu hĆ¶Ć“Ć¹ng tieĆ”n ƱeĆ”n gĆ­a trĆ² bieĆ¢n ( tƶƓng Ć¶Ć¹ng vĆ“Ć¹i
caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n cuĆ»a haĆøm ).
b) CaĆ¹c thuĆ» tuĆÆc ƱeƤ quy.
ThuĆ» tuĆÆc ƱeƤ quy laĆø thuĆ» tuĆÆc coĆ¹ chĆ¶Ć¹a leƤnh goĆÆi ƱeĆ”n noĆ¹ . ThuĆ» tuĆÆc ƱeƤ quy thƶƓĆøng ƱƶƓĆÆc sƶƻ
duĆÆng ƱeĆ„ moĆ¢ taĆ» caĆ¹c thao taĆ¹c treĆ¢n caĆ”u truĆ¹c dƶƵ lieƤu coĆ¹ tĆ­nh ƱeƤ quy
VĆ­ duĆÆ 1 :
Xem daƵy n phaĆ n tƶƻ a[1:n] laĆø sƶĆÆ keĆ”t hĆ“ĆÆp giƶƵa daƵy a[1:n-1] vaĆø a[n] .
Do Ʊo Ć¹:
- ThuĆ» tuĆÆc tƬm max trong daƵy a[1:n] ( thuĆ» tuĆÆc TMax) coĆ¹ theĆ„ thƶĆÆc hieƤn theo
luaƤt ƱeƤ qui : + TƬm max trong daƵy con a[1:n] (goĆÆi ƱeƤ quy Tmax(a[1:n-1] ) ).
+ TƬm max cuĆ»a 2 soĆ” : Tmax(a[1:n-1]) vaĆø a[n] (giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy).
TĆ¶Ć¹c laĆø :
TMax(a[1:n]) = max(TMax(a[1:n-l]) , a[n] )
vĆ“Ć¹i TMax(a[m:m] = a[m] ; ( trƶƓĆøng hĆ“ĆÆp neo )
max(x,y) = x > y ? x : y ; ( giaƻi thuaƤt tƭnh max 2 soƔ : if (x>y) then
max(x ,y) = x else max(x ,y) = y )
- ThuĆ» tuĆÆc tĆ­nh toĆ„ng caĆ¹c phaĆ n tƶƻ ( thuĆ» tuĆÆc TSUM ) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt ƱeƤ
quy :
+ TƬm toĆ„ng daƵy con a[1:n] (goĆÆi ƱeƤ quy TSUM(a[1:n-1]) ).
+ TƬm toĆ„ng cuĆ»a 2 soĆ” : TSUM(a[1:n-1]) vaĆø a[n] (giaĆ»i thuaƤt khoĆ¢ng ƱeƤ
quy).
TĆ¶Ć¹c laĆø :
TSUM(a[1:n]) = a[n] + TSUM(a[1:n-1]
vĆ“Ć¹i TSUM(a[m:m]) = a[m]
VĆ­ duĆÆ 2 :
Xem daƵy a[m : n] laĆø sƶĆÆ keĆ”t noĆ”i giƶƵa hai daƵy: daƵy a[m:((m+n) div 2)] vaĆø
daƵy a[(((m+n) div 2)+1) :n] .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 10 -
Do Ʊo Ć¹:
- ThuĆ» tuĆÆc tƬm max trong daƵy a[1:n] ( thuĆ» tuĆÆc Tmax1) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt
ƱeƤ qui :
+ TƬm max trong daƵy con traĆ¹i a[m:((m+n) div 2)]
(goĆÆi ƱeƤ quy Tmax1(a[m:((m+n) div 2)] ) ).
+ TƬm max trong daƵy con phaƻi a[(((m+n) div 2)+1) :n] .
(goĆÆi ƱeƤ quy Tmax1(a[(((m+n) div 2)+1) :n] ).
+ TƬm max cuĆ»a 2 soĆ” : Tmax1(a[m:((m+n) div 2)] ) vaĆø
Tmax1(a[(((m+n) div 2)+1) :n] ). (giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy).
TĆ¶Ć¹c laĆø :Tmax1(a[m:n]) =
max(Tmax1(a[m:((m+n) div 2)] ) ,Tmax1(a[(((m+n) div 2)+1) :n]) ).
vĆ“Ć¹i Tmax1(a[m:m] = a[m] ; ( trƶƓĆøng hĆ“ĆÆp neo )
max(x,y) = x > y ? x : y ;
- ThuĆ» tuĆÆc tĆ­nh toĆ„ng caĆ¹c phaĆ n tƶƻ ( TSUM1 ) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt ƱeƤ quy :
+ TƬm toĆ„ng daƵy con traĆ¹i a[m:((m+n) div 2)]
(goĆÆi ƱeƤ quy TSUM1 (a[m:((m+n) div 2)] ) ).
+ TƬm toƄng daƵy con phaƻi a[(((m+n) div 2)+1) :n] .
(goĆÆi ƱeƤ quy TSUM1 (a[(((m+n) div 2)+1) :n] ) ).
+ TƬm toƄng cuƻa 2 soƔ :
TSUM1 (a[m:((m+n) div 2)] ) vaĆø TSUM1 (a[(((m+n) div 2)+1) :n] ).
TĆ¶Ć¹c laĆø : TSUM1 (a[m:n]) =
TSUM1 (a[m:((m+n) div 2)]) + TSUM1 (a[(((m+n) div 2)+1) :n] )
vĆ“Ć¹i TSUM1 (a[m:m]) = a[m]
VĆ­ duĆÆ 3 :
CaĆ¢y nhĆ² phaĆ¢n tƬm kieĆ”m kieĆ„u T(BST) laĆø moƤt caĆ”u truĆ¹c goĆ m : moƤt nuĆ¹t kieĆ„u T keĆ”t noĆ”i
vĆ“Ć¹i 2 caĆ¢y con nhi phaĆ¢n tƬm kieĆ”m kieĆ„u T neĆ¢n :
- ThuĆÆ tuĆÆc queĆ¹t caĆ¢y nhi nhaĆ¢n tƬm kieĆ”m theo thĆ¶Ć¹ tƶĆÆ giƶƵa (LNF) laĆø :
+ QueĆ¹t caĆ¢y con traĆ¹i theo thĆ¶Ć¹ tƶĆÆ giƶƵa ;
+ ThaĆŖm nuĆ¹t goĆ”c ;
+ QueĆ¹t caĆ¢y con phaĆ»i theo thĆ¶Ć¹ tƶĆÆ giƶƵa ;
- ThuĆ» tuĆÆc tƬm kieĆ”m giaĆ¹ tri Ī±o treĆ¢n caĆ¢y nhĆ² phaĆ¢n tƬm kieĆ”m Root laĆø :
NeĆ”u Root ā‰” āˆ… thƬ thƶĆÆc hieƤn thao taĆ¹c roĆ£ng (khoĆ¢ng laĆøm gƬ )
Con khoĆ¢ng
neĆ”u giaĆ¹ trĆ² taĆÆi nuĆ¹t goĆ”c = Ī±o thƬ thoĆ¢ng baĆ¹o tƬm thaĆ”y vaĆø dƶĆøng
CoĆøn khoĆ¢ng
neĆ”u giaĆ¹ trĆ² taĆÆi nuĆ¹t goĆ”c < Ī±o thƬ tƬm Ć“Ć» caĆ¢y con traĆ¹i
CoĆøn khoĆ¢ng thƬ tƬm Ć“Ć» caĆ¢y con phaĆ»i .
NhaƤn xeĆ¹t :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 11 -
Trong moƤt thuĆ» tuĆÆc ƱeƤ qui, ƱeĆ„ cho vieƤc goĆÆi ƱeƤ quy dƶĆøng laĆÆi sau hƶƵu haĆÆn laĆ n goĆÆi noĆ¹
caĆ n chĆ¶Ć¹a ƱieĆ u kieƤn kieĆ„m tra (moƤt bieĆ„u thĆ¶Ć¹c boolean B treĆ¢n moƤt nhoĆ¹m bieĆ”n ) , ƱeĆ„ khi
ƱieĆ u kieƤn naĆøy khoĆ¢ng coĆøn thoĆ»a thƬ vieƤc goĆÆi ƱeƤ qui keĆ”t thuĆ¹c .
DaĆÆng thƶƓĆøng gaĆ«p cuĆ»a thuĆ» tuĆÆc ƱeƤ qui laĆø :
S1 ; ( khoĆ¢ng chĆ¶Ć¹a yeĆ”u toĆ” ƱeƤ qui )
if B then S2 ( phaĆ n leƤnh trƶĆÆc tieĆ”p , khoĆ¢ng coĆ¹ leƤnh goĆÆi ƱeƤ qui )
else Sdq ; ( phaĆ n leƤnh coĆ¹ leƤnh goĆÆi ƱeƤ qui )
S3 ; (khoĆ¢ng coĆ¹ goĆÆi ƱeƤ qui )
3. MaƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ qui trong caĆ¹c ngoĆ¢n ngƶƵ laƤp trƬnh.
a) ToƄng quan.
KhoĆ¢ng phaĆ»i moĆÆi ngoĆ¢n ngƶƵ laƤp trƬnh hieƤn coĆ¹ ƱeĆ u coĆ¹ theĆ„ maƵ hoĆ¹a ƱƶƓĆÆc giaĆ»i thuaƤt ƱeƤ
quy, chƦ moƤt soĆ” nhƶƵng ngoĆ¢n ngƶƵ laƤp trƬnh coĆ¹ khaĆ» naĆŖng toĆ„ chĆ¶Ć¹c vuĆøng nhĆ“Ć¹ kieĆ„u stack
mĆ“Ć¹i coĆ¹ khaĆ» naĆŖng maƵ hoĆ¹a ƱƶƓĆÆc giaĆ»i thuaƤt ƱeƤ quy .
CaĆ¹c ngoĆ¢n ngƶƵ laƤp trƬnh hieƤn nay ƱeĆ u maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy baĆØng caĆ¹ch toĆ„ chĆ¶Ć¹c caĆ¹c
chƶƓng trƬnh con ƱeƤ quy tƶƓng Ć¶Ć¹ng .
b) TheĆ„ hieƤn ƱeƤ qui trong NNLT PASCAL vaĆø C++
NN LT Pascal vaĆø C++ ƱeĆ u cho pheĆ¹p maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy baĆØng caĆ¹ch toĆ„ chĆ¶Ć¹c
chƶƓng trƬnh con ƱeĆ¢ quy nhĆ“Ćø vaĆøo cĆ“ cheĆ” taĆÆo vuĆøng nhĆ“Ć¹ Stak cuĆ»a phaĆ n meĆ m ngoĆ¢n ngƶƵ .
b1) Trong NNLT C++.
NNLT C++ cho pheĆ¹p maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy moƤt caĆ¹ch thuaƤn lĆ“ĆÆi nhĆ“Ćø vaĆøo kyƵ thuaƤt
khai baĆ¹o trĆ¶Ć“Ć¹c tieĆ¢u ƱeĆ  neĆ¢n khoĆ¢ng coĆ¹ sƶĆÆ phaĆ¢n bieƤt hƬnh thĆ¶Ć¹c naĆøo trong vieƤc khai baĆ¹o
giƶƵa haĆøm con ƱeƤ quy vaĆø haĆøm con khoĆ¢ng ƱeƤ quy.
b2) Trong NN LT Pascal .
ƑoĆ”i vĆ“Ć¹i chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p thƬ hƬnh thĆ¶Ć¹c khai baĆ¹o cuƵng gioĆ”ng nhƶ ƱoĆ”i
vĆ“Ć¹i chƶƓng trƬnh con khoĆ¢ng ƱeƤ quy.
ƑoĆ”i vĆ“Ć¹i chƶƓng trƬnh con ƱeƤ quy giaĆ¹n tieĆ”p thƬ hƬnh thĆ¶Ć¹c khai baĆ¹o coĆ¹ thay ƱoĆ„i Ć­t nhieĆ u
nhaĆØm thoĆ»a quy taĆ©c taĆ m vƶĆÆc cuĆ»a ngoĆ¢n ngƶƵ ( trong phaĆ n leƤnh cuĆ»a moƤt chƶƓng trƬnh con
chƦ ƱƶƓĆÆc goĆÆi nhƶƵng chƶƓng trƬnh con cuĆøng caĆ”p ƱaƵ ƱƶƓĆÆc khai baĆ¹o trĆ¶Ć“Ć¹c ).
VĆ­ duĆÆ :
VĆ“Ć¹i moĆ¢ hƬnh chƶƓng trƬnh sau :
Trong phaĆ n leƤnh cuĆ»a khoĆ”i A coĆ¹ theĆ„ goĆÆi ƱeĆ”n :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 12 -
+ GoĆÆi caĆ¹c chƶƓng trƬnh con trƶĆÆc tieĆ”p cuĆ»a noĆ¹
goĆÆi ƱƶƓĆÆc B nhƶng khoĆ¢ng goĆÆi ƱƶƓĆÆc C
+ GoĆÆi chĆ­nh noĆ¹ ( goĆÆi ƱeƤ quy ).
+ GoĆÆi chƶƓng trƬnh con cuĆøng caĆ”p nhƶmg
phaĆ»i khai baĆ¹o trĆ¶Ć“Ć¹c goĆÆi ƱƶƓĆÆc E nhƶng
khoĆ¢ng goĆÆi ƱƶƓĆÆc D , MuoĆ”n goĆÆi D phaĆ»i
khai baĆ¹o trĆ¶Ć“Ć¹c ( khai baĆ¹o FORWARD)
Khai baĆ¹o trĆ¶Ć“Ć¹c FORWARD .
D
A
B
C
Program
E
ƑeĆ„ tƶĆø thuĆ» tuĆÆc haĆøm A coĆ¹ theĆ„ goĆÆi ƱeĆ”n D laĆø thuĆ» tuĆÆc haĆøm cuĆøng caĆ”p nhƶng ƱƶƓĆÆc moĆ¢ taĆ» sau
A, ta caĆ n coĆ¹ moƤt khai baĆ¹o trĆ¶Ć“Ć¹c cuĆ»a D Ć“Ć» phĆ­a trĆ¶Ć“Ć¹c cuĆ»a A . Khai baĆ¹o naĆøy goĆ m : tieĆ¢u ƱeĆ 
cuĆ»a D, vĆ“Ć¹i danh saĆ¹ch thoĆ¢ng soĆ” cuĆ»a D, tieĆ”p theo laĆø tƶĆø khoaĆ¹ FORWARD . Sau ƱoĆ¹ luĆ¹c
moĆ¢ taĆ» laĆÆi D thƬ chƦ caĆ n khai baĆ¹o tƶĆø khoaĆ¹ PROCEDURE ( hoaĆ«c FUNCTION ) , teĆ¢n cuĆ»a
D ( khoĆ¢ng coĆ¹ danh saĆ¹ch thoĆ¢ng soĆ” ) , phaĆ n thaĆ¢n cuĆ»a D.
VĆ­ duĆÆ : VĆ“Ć¹i 2 thuĆ» tuĆÆc goĆÆi ƱeƤ quy hoĆ£ tƶƓng nhau FIRST,SECOND seƵ ƱƶƓĆÆc khai baĆ¹o
nhƶ sau :
procedure SECOND (i : integer ) ; Forward ;
procedure FIRST (n : integer ; var X : real);
var j, k : interger ;
begin
for j := 1 to n do begin
writeln(ā€˜ j = ā€˜, j ) ;
k := n ā€“ 2* j ;
SECOND( k );
end ;
end ;
procedure second ;
begin
if ( i > 0 ) then begin
writeln(ā€˜ i= ā€˜, i );
FIRST( i ā€“ 1 ) ;
end ;
end ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 13 -
4. MoƤt soĆ” daĆÆng giaĆ»i thuaƤt ƱeƤ quy ƱƓn giaĆ»n thƶƓĆøng gaĆ«p .
a) ƑeƤ quy tuyeĆ”n tĆ­nh.
ChƶƓng trƬnh con ƱeƤ quy tuyeĆ”n tĆ­nh laĆø chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p ƱƓn
giaĆ»n nhaĆ”t coĆ¹ daĆÆng :
P ā‰” { NEƁU thoĆ»a ƱieĆ u kieƤn dƶĆøng thƬ thƶĆÆc hieƤn S ;
CoĆøn khoĆ¢ng begin { thƶĆÆc hieƤn S* ; goĆÆi P }
}
VĆ“Ć¹i S , S* laĆø caĆ¹c thao taĆ¹c khoĆ¢ng ƱeƤ quy .
VĆ­ duĆÆ 1 : HaĆøm FAC(n) tĆ­nh soĆ” haĆÆng n cuĆ»a daƵy n!
+ DaĆÆng haĆøm trong ngoĆ¢n ngƶƵ maƵ giaĆ» :
{ NeĆ”u n = 0 thƬ FAC = 1 ; /* trƶƓĆøng hĆ“ĆÆp neo */
CoĆøn khoĆ¢ng FAC = n*FAC(n-1) }
+ DaĆÆng haĆøm trong ngoĆ¢n ngƶƵ Pascal :
Function FAC(n : integer) : integer;
begin
if( n = 0 ) then FAC := 1
else FAC := n*FAC(n-1) ;
end;
+ DaĆÆng haĆøm trong C++ :
int FAC( int n )
{ if ( n == 0 ) return 1 ;
else return ( n * FAC(n-1 )) ;
}
VĆ­ duĆÆ 2 :
ChƶƓng trƬnh con tĆ­nh USCLN cuĆ»a 2 soĆ” dƶĆÆa vaĆøo thuaƤt toaĆ¹n Euclide :
+ DaĆÆng haĆøm treĆ¢n ngoĆ¢n ngƶƵ toaĆ¹n hoĆÆc :
USCLN(m , n ) = USCLN(n , m mod n ) khi n ā‰  0
USCLN(m , 0) = m
+ DaĆÆng haĆøm trong ngoĆ¢n ngƶƵ maƵ giaĆ» :
NeƔu n = 0 thƬ USCLN = m
CoĆøn khoĆ¢ng USCLN = USCLN( n , m mod n ) ;
+ DaĆÆng haĆøm trong Pascal :
Function USCLN(m , n : integer ) : integer ;
begin
if (n = 0 ) then USCLN := m
else USCLN := USCLN( n , m mod n ) ;
end ;
+DaĆÆng haĆøm trong C++ :
int USCLN( int m , int n )
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 14 -
{ if(n == 0 ) return (m) ;
else return ( USCLN( n , m mod n)) ;
}
b) ƑeƤ quy nhĆ² phaĆ¢n.
ChƶƓng trƬnh con ƱeƤ quy nhĆ² phaĆ¢n laĆø chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p coĆ¹ daĆÆng :
P ā‰” { NEƁU thoĆ»a ƱieĆ u kieƤn dƶĆøng thƬ thƶĆÆc hieƤn S ;
CoĆøn khoĆ¢ng begin { thƶĆÆc hieƤn S* ; goĆÆi P ; goĆÆi P }
}
VĆ“Ć¹i S , S* laĆø caĆ¹c thao taĆ¹c khoĆ¢ng ƱeƤ quy .
VĆ­ duĆÆ 1 : HaĆøm FIBO(n) tĆ­nh soĆ” haĆÆng n cuĆ»a daƵy FIBONACCI
+ DaĆÆng haĆøm trong Pascal:
Function F(n : integer) : integer;
begin
if( n < 2 ) then F := 1
else F := F(n-1) + F(n-2)
end;
+ DaĆÆng haĆøm trong C++ :
int F(int n)
{ if ( n < 2 ) return 1 ;
else return (F(n -1) + F(n -2)) ;
}
c) ƑeƤ quy phi tuyeĆ”n.
ChƶƓng trƬnh con ƱeƤ quy phi tuyeĆ”n laĆø chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p maĆø lĆ“Ćøi goĆÆi
ƱeƤ quy ƱƶƓĆÆc thƶĆÆc hieƤn beĆ¢n trong voĆøng laĆ«p .
DaĆÆng toĆ„ng quaĆ¹t cuĆ»a chƶƓng trƬnh con ƱeƤ quy phi tuyeĆ”n laĆø :
P ā‰” { for giaĆ¹ tri ƱaĆ u to giaĆ¹ trĆ² cuoĆ”i do
begin thƶĆÆc hieƤn S ;
if ( thoĆ»a ƱieĆ u kieƤn dƶĆøng ) then thƶĆÆc hieƤn S*
else goĆÆi P
end ;
}
VĆ“Ć¹i S , S* laĆø caĆ¹c thao taĆ¹c khoĆ¢ng ƱeƤ quy .
VĆ­ duĆÆ :
Cho daƵy { Xn } xaĆ¹c Ć±Ć²nh theo coĆ¢ng thĆ¶Ć¹c truy hoĆ i :
X0 = 1 ; Xn = n2
XO +(n-1)2
X1 + . . . + 2 2
Xn-2 + 1 2
Xn-1
+ DaĆÆng haĆøm ƱeƤ quy tĆ­nh Xn treĆ¢n ngoĆ¢n ngƶƵ maƵ giaĆ» laĆø :
Xn ā‰” if ( n= 0 ) then return 1 ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 15 -
else { tg = 0 ;
for i = 0 to n-1 do tg = tg + (n-i)2
Xi ;
return tg ;
}
+ DaĆÆng haĆøm ƱeƤ quy tĆ­nh Xn treĆ¢n ngoĆ¢n ngƶƵ Pascal laĆø :
function X( n :integer) : integer ;
var i , tg : integer ;
begin
if ( n= 0 ) then X := 1
else
begin tg = 0 ;
for i: = 0 to n-1 do tg : = tg + sqr(n-i) *X(i) ;
X := tg ;
end ;
end ;
+ DaĆÆng haĆøm ƱeƤ quy tĆ­nh Xn treĆ¢n ngoĆ¢n ngƶƵ C++ laĆø :
int X( int n ) ;
{ if ( n == 0 ) return 1 ;
else { int tg = 0 ;
for (int i = 0 ; i<n ; i++ ) tg = tg + sqr(n-i) *X(i);
return ( tg ) ;
}
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 16 -
CHƖƔNG II
BAƘI TOAƙN ƑEƄ QUY
I. CAƙC NOƄI DUNG CAƀN LAƘM ƑEƅ TƌM GIAƛI THUAƄT ƑEƄ QUY CHO
MOƄT BAƘI TOAƙN.
ƑeĆ„ xaĆ¢y dƶĆÆng giaĆ»i thuaƤt giaĆ»i moƤt baĆøi toaĆ¹n coĆ¹ tĆ­nh ƱeƤ quy baĆØng phƶƓng phaĆ¹p ƱeƤ quy ta
caĆ n thƶĆÆc hieƤn tuaĆ n tƶĆÆ 3 noƤi dung sau :
- ThoĆ¢ng soĆ” hoĆ¹a baĆøi toaĆ¹n .
- TƬm caĆ¹c trƶƓĆøng hĆ“ĆÆp neo cuĆøng giaĆ»i thuaƤt giaĆ»i tƶƓng Ć¶Ć¹ng .
- TƬm giaĆ»i thuaƤt giaĆ»i trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t baĆØng phaĆ¢n raƵ baĆøi toaĆ¹n theo kieĆ„u
ƱeƤ quy.
1. ThoĆ¢ng soĆ” hoaĆ¹ baĆøi toaĆ¹n.
ToĆ„ng quaĆ¹t hoĆ¹a baĆøi toaĆ¹n cuĆÆ theĆ„ caĆ n giaĆ»i thaĆønh baĆøi toaĆ¹n toĆ„ng quaĆ¹t (moƤt hoĆÆ caĆ¹c baĆøi toaĆ¹n
chĆ¶Ć¹a baĆøi toaĆ¹n caĆ n giaĆ»i ),tƬm ra caĆ¹c thoĆ¢ng soĆ” cho baĆøi toaĆ¹n toĆ„ng quaĆ¹t ƱaĆ«c bieƤt laĆø nhoĆ¹m
caĆ¹c thoĆ¢ng soĆ” bieĆ„u thĆ² kĆ­ch thĆ¶Ć“Ć¹c cuĆ»a baĆøi toaĆ¹n ā€“ caĆ¹c thoĆ¢ng soĆ” ƱieĆ u khieĆ„n ( caĆ¹c thoĆ¢ng soĆ”
maĆø ƱoƤ lĆ“Ć¹n cuĆ»a chuĆ¹ng ƱaĆ«c trƶng cho ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a baĆøi toaĆ¹n , vaĆø giaĆ»m Ʊi qua moĆ£i laĆ n
goĆÆi ƱeƤ qui ) .
VĆ­ duĆÆ : n trong haĆøm FAC(n) ; a , b trong haĆøm USCLN(a,b) .
2. PhaĆ¹t hieƤn caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n (neo) vaĆø tƬm giaĆ»i thuaƤt cho caĆ¹c
trƶƓĆøng hĆ“ĆÆp naĆøy.
ƑaĆ¢y laĆø caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n cuĆ»a baĆøi toaĆ¹n toĆ„ng quaĆ¹t , laĆø caĆ¹c trƶƓng hĆ“ĆÆp tƶƓng Ć¶Ć¹ng
vĆ“Ć¹i caĆ¹c gĆ­a trĆ² bieĆ¢n cuĆ»a caĆ¹c bieĆ”n ƱieĆ u khieĆ„n (trƶƓĆøng hĆ“ĆÆp kĆ­ch thĆ¶Ć“Ć¹c baĆøi toaĆ¹n nhoĆ» nhaĆ”t),
maĆø giaĆ»i thuaƤt giaĆ»i khoĆ¢ng ƱeƤ qui (thƶƓĆøng raĆ”t ƱƓn giaĆ»n).
VĆ­ duĆÆ :
FAC(1) =1 , USCLN(a,0) = a , SM(a[x:x] ā‰”āˆ… ,TSUM(a[m:m]) = a[m]
3. PhaĆ¢n raƵ baĆøi toaĆ¹n toĆ„ng quaĆ¹t theo phƶƓng thĆ¶Ć¹c ƱeƤ quy.
TƬm phƶƓng aĆ¹n (giaĆ»i thuaƤt ) giaĆ»i baĆøi toaĆ¹n trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t baĆØng caĆ¹ch phaĆ¢n
chia noĆ¹ thaĆønh caĆ¹c thaĆønh phaĆ n maĆø hoaĆ«c coĆ¹ giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy hoaĆ«c laĆø baĆøi toaĆ¹n
treĆ¢n nhƶng coĆ¹ kĆ­ch thĆ¶Ć“Ć¹c nhoĆ» hĆ“n.
VĆ­ duĆÆ : FAC(n) = n * FAC(n -1) .
Tmax(a[1:n]) = max(Tmax(a[1:(n-1)]) , a[n] )
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 17 -
II. MOƄT SOƁ BAƘI TOAƙN GIAƛI BAƈNG GIAƛI THUAƄT ƑEƄ QUY ƑIEƅN
HƌNH.
1. BaĆøi toaĆ¹n thaĆ¹p HaĆø NoƤi .
TruyeĆ n thuyeĆ”t keĆ„ raĆØng : MoƤt nhaĆø toaĆ¹n hoĆÆc PhaĆ¹p sang thaĆŖm ƑoĆ¢ng DƶƓng ƱeĆ”n moƤt ngoĆ¢i
chuĆøa coĆ„ Ć“Ć» HaĆø NoƤi thaĆ”y caĆ¹c vĆ² sƶ Ʊang chuyeĆ„n moƤt choĆ ng Ć±Ć³a quĆ¹y goĆ m 64 Ć±Ć³a vĆ“Ć¹i kĆ­ch
thĆ¶Ć“Ć¹c khaĆ¹c nhau tƶĆø coƤt A sang coƤt C theo caĆ¹ch :
- MoĆ£i laĆ n chƦ chuyeĆ„n 1 Ć±Ć³a .
- Khi chuyeĆ„n coĆ¹ theĆ„ duĆøng coƤt trung gian B .
- Trong suoĆ”t quĆ¹a trƬnh chuyeĆ„n caĆ¹c choĆ ng Ć±Ć³a Ć“Ć» caĆ¹c coƤt luoĆ¢n ƱƶƓĆÆc xeĆ”p ƱuĆ¹ng (Ć±Ć³a
coĆ¹ kĆ­ch thĆ¶Ć“Ć¹c beĆ¹ ƱƶƓĆÆc ƱaĆ«t treĆ¢n Ć±Ć³a coĆ¹ kĆ­ch thĆ¶Ć“Ć¹c lĆ“Ć¹n ) .
Khi ƱƶƓĆÆc hoĆ»i caĆ¹c vĆ² sƶ cho bieĆ”t khi chuyeĆ„n xong choĆ ng Ć±Ć³a thƬ ƱeĆ”n ngaĆøy taƤn theĆ” !.
Nhƶ seƵ chƦ ra sau naĆøy vĆ“Ć¹i choĆ ng goĆ m n Ć±Ć³a caĆ n - 1 laĆ n chuyeĆ„n cĆ“ baĆ»n (chuyeĆ„n 1
Ć±Ć³a ).
2n
GiaĆ» sƶƻ thĆ“Ćøi gian ƱeĆ„ chuyeĆ„n 1 ƱƦa laĆø t giaĆ¢y thƬ thĆ“Ćøi gian ƱeĆ„ chuyeĆ„n xong choĆ ng 64 Ć±Ć³a
seƵ laĆø :
T = ( 2 ) * t S = 18164
āˆ’ 4 1019
. * *t S
VĆ“Ć¹i t = 1/100 s thƬ T = 5.8*109
naĆŖm = 5.8 tyĆ» naĆŖm .
Ta coĆ¹ theĆ„ tƬm thaĆ”y giaĆ»i thuaƤt (daƵy caĆ¹c thao taĆ¹c cĆ“ baĆ»n ) cho baĆøi toaĆ¹n moƤt caĆ¹ch deĆ£
daĆøng Ć¶Ć¹ng vĆ“Ć¹i trƶƓĆøng hĆ“ĆÆp choĆ ng Ć±Ć³a goĆ m 0, 1, 2, 3 Ć±Ć³a . VĆ“Ć¹i choĆ ng 4 Ć±Ć³a giaĆ»i thuaƤt baĆøi
toaĆ¹n ƱaƵ trĆ“Ć» neĆ¢n phĆ¶Ć¹c taĆÆp . Tuy nhieĆ¢n giaĆ»i thuaƤt cuĆ»a baĆøi toaĆ¹n laĆÆi ƱƶƓĆÆc tƬm thaĆ”y raĆ”t deĆ£
daĆøng nhanh choĆ¹ng khi ta khaĆ¹i quaĆ¹t soĆ” Ć±Ć³a laĆø n baĆ”t kyĆø vaĆø nhƬn baĆøi toaĆ¹n baĆØng quan nieƤm
ƱeƤ quy .
a) ThoĆ¢ng soĆ” hoĆ¹a baĆøi toaĆ¹n .
XeĆ¹t baĆøi toaĆ¹n Ć“Ć» mĆ¶Ć¹c toĆ„ng quaĆ¹t nhaĆ”t : chuyeĆ„n n (n>=0) Ć±Ć³a tƶĆø coƤt X sang coƤt Z
laĆ”y coƤt Y laĆøm trung gian .
Ta goĆÆi giaĆ»i thuaƤt giaĆ»i baĆøi toaĆ¹n Ć“Ć» mĆ¶Ć¹c toĆ„ng quaĆ¹t laĆø thuĆ» tuĆÆc THN(n ,X ,Y,Z) chĆ¶Ć¹a 4
thoĆ¢ng soĆ” n,X,Y,Z ; n thuoƤc taƤp soĆ” tƶĆÆ nhieĆ¢n N (kieĆ„u nguyeĆ¢n khoĆ¢ng daĆ”u ); X ,Y,Z thuoƤc
taƤp caĆ¹c kyĆ¹ tƶĆÆ (kieĆ„u kyĆ¹ tƶĆÆ ).
BaĆøi toaĆ¹n coĆ„ Ć“Ć» treĆ¢n seĆ» ƱƶƓĆÆc thƶĆÆc hieƤn baĆØng lĆ“Ćøi goĆÆi THN(64,A,B,C) .
DeĆ£ thaĆ”y raĆØng : trong 4 thoĆ¢ng soĆ” cuĆ»a baĆøi toaĆ¹n thƬ thoĆ¢ng soĆ” n laĆø thoĆ¢ng soĆ” quyeĆ”t Ć±Ć²nh ƱoƤ
phĆ¶Ć¹c taĆÆp cuĆ»a baĆøi toaĆ¹n ( n caĆøng lĆ“Ć¹n thƬ soĆ” thao taĆ¹c chuyeĆ„n ƱƦa caĆøng nhieĆ u vaĆø thĆ¶Ć¹ tƶĆÆ thƶĆÆc
hieƤn chuĆ¹ng caĆøng khoĆ¹ hƬnh dung ) , n laĆø thoĆ¢ng soĆ” ƱieĆ u khieĆ„n .
b) TrƶƓĆøng hĆ“ĆÆp suy bieĆ”n vaĆø caĆ¹ch giaĆ»i .
VĆ“Ć¹i n =1 baĆøi toaĆ¹n toĆ„ng quaĆ¹t suy bieĆ”n thaĆønh baĆøi toaĆ¹n ƱƓn giaĆ»n THN (1,X,Y,Z) : tƬm
daƵy thao taĆ¹c ƱeĆ„ chuyeĆ„n choĆ ng 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Z laĆ”y coƤt Y laĆøm trung gian . GiaĆ»i
thuaƤt giaĆ»i baĆøi toaĆ¹n THN (1,X,Y,Z) laĆø thƶĆÆc hieƤn chƦ 1 thao taĆ¹c cĆ“ baĆ»n : ChuyeĆ„n 1 Ć±Ć³a tƶĆø
X sang Z ( kyĆ¹ hieƤu laĆø Move (X , Z) ) .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 18 -
THN(1,X,Y,Z) ā‰” { Move( X, Z ) }
ChuĆ¹ yĆ¹ : HoaĆøn toaĆøn tƶƓng tƶĆÆ ta cuƵng coĆ¹ theĆ„ quan nieƤn trƶƓĆøng hĆ“ĆÆp suy bieĆ”n laĆø trƶƓĆøng
hĆ“ĆÆp n= 0 tƶƓng Ć¶Ć¹ng vĆ“Ć¹i baĆøi toaĆ¹n THN(0,X,Y,Z) : chuyeĆ„n 0 Ć±Ć³a tƶĆø X sang Z laĆ”y Y laĆøm
trung gian maĆø giaĆ»i thuaƤt tƶƓng Ć¶Ć¹ng laĆø khoĆ¢ng laĆøm gƬ caĆ» ( thƶĆÆc hieƤn thao taĆ¹c roĆ£ng ) .
THN(0,X,Y,Z) ā‰” { Ļ† }
c) PhaĆ¢n raƵ baĆøi toaĆ¹n :
Ta coĆ¹ theĆ„ phaĆ n raƵ baĆøi toaĆ¹n TH N (k,X,Y,Z) : chuyeĆ„n k Ć±Ć³a tƶĆø coƤt X sang coƤt Z
laĆ”y coƤt Y laĆøm trung gian thaĆønh daƵy tuaĆ n tƶĆÆ 3 coĆ¢ng vieƤc sau :
+ ChuyeĆ„n (k -1) Ć±Ć³a tƶĆø coƤt X sang coƤt Y laĆ”y coƤt Z laĆøm trung gian :
THN (k -1,X,Z,Y) (baĆøi toaĆ¹n THN vĆ“Ć¹i n = k-1,X= X , Y = Z , Z = Y )
+ ChuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Z : Move ( X, Z ) (thao taĆ¹c cĆ“ baĆ»n ).
+ ChuyeĆ„n (k - 1 ) Ć±Ć³a tƶĆø coƤt Y sang coƤt Z laĆ”y coƤt X laĆøm trung gian :
THN( k -1,Y,X,Z) ( baĆøi toaĆ¹n THN vĆ“Ć¹i n = k-1 , X = Y , Y = X , Z = Z ) .
VaƤy giaĆ»i thuaƤt trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t (n > 1) laĆø :
THN(n,X,Y,Z) ā‰” { THN (n -1,X,Z,Y) ;
Move ( X, Z ) ;
THN (n -1,Y,X,Z) ;
}
VĆ“Ć¹i n Ć±Ć³a thƬ caĆ n bao nhieĆ¢u bĆ¶Ć“Ć¹c chuyeĆ„n 1 Ć±Ć³a? ThƶĆÆc chaĆ”t trong thuĆ» tuĆÆc THN caĆ¹c
leƤnh goĆÆi ƱeƤ qui chƦ nhaĆØm saĆ©p seĆ”p trƬnh tƶĆÆ caĆ¹c thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a
SoĆ” laĆ n chuyeĆ„n 1 Ć±Ć³a ƱƶƓĆÆc thƶĆÆc hieƤn laĆø ƱaĆ«c trƶng cho ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a giaĆ»i thuaƤt .
VĆ“Ć¹i n Ć±Ć³a , goĆÆi f(n) laĆø soĆ” caĆ¹c thao taĆ¹c chuyeĆ„n _moƤt_Ć±Ć³a .
Ta coĆ¹ : f(0) = 0 .
f(1) =1 .
f(n) = 2f(n -1) + 1 vĆ“Ć¹i n > 0
Do Ʊo Ć¹ : f(n) = 1+ 2 + 2 2
+ + 2 n-1
= 2 n
- 1
ƑeĆ„ chuyeĆ„n 64 Ć±Ć³a caĆ n 2 64
- 1 bĆ¶Ć“Ć¹c hay xaĆ”p xƦ 10 20
bĆ¶Ć“Ć¹c . CaĆ n khoaĆ»ng 10 trieƤu
naĆŖm vĆ“Ć¹i moƤt maĆ¹y tĆ­nh nhanh nhaĆ”t hieƤn nay ƱeĆ„ laĆøm vieƤc naĆøy .
d) ChƶƓng trƬnh con maƵ hoĆ¹a giaĆ»i thuaƤt THN trong NNLT Pascal :
procedure THN (n : integer ; X,Y,Z : char)
begin
if n > 0 then begin
THN (n-1 ,X,Z,Y) ;
Move( X, Z);
THN (n-1 ,Y,X,Z);
end ;
end ;
( LaĆ”y trƶƓĆøng hĆ“ĆÆp chuyeĆ„n n = 0 laĆøm trƶƓĆøng hĆ“ĆÆp neo )
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 19 -
Hoaƫc : procedure THN (n : integer ; X,Y,Z : char)
begin
if (n = 1) then Move(X, Z)
else begin
THN (n-1 ,X,Z,Y ) ;
Move(X, Z );
THN (n -1 ,Y,X,Z );
end ;
end;
( LaĆ”y trƶƓĆøng hĆ“ĆÆp chuyeĆ„n n = 1 laĆøm trƶƓĆøng hĆ“ĆÆp neo )
VĆ“Ć¹i thuĆ» tuĆÆc Move(X, Y) moĆ¢ taĆ» thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Y ƱƶƓĆÆc vieĆ”t
tuyĆø theo caĆ¹ch theĆ„ hieƤn thao taĆ¹c chuyeĆ„n .
e) ChƶƓng trƬnh con maƵ hoĆ¹a giaĆ»i thuaƤt THN trong NNLT C++ :
Trong C++ haĆøm con thƶĆÆc hieƤn giaĆ»i thuaƤt THN coĆ¹ daĆÆng :
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 ;
}
hoaƫc :
void THN( int n , char X,Y,Z)
{ if(n = = 1) Move ( X , Z ) ;
else
{ THN(n -1,X,Z,Y ) ;
Move ( X, Z ) ;
THN(n - 1,Y,X,Z ) ;
}
return ;
}
2. BaĆøi toaĆ¹n chia thƶƓƻng.
CoĆ¹ 100 phaĆ n thƶƓƻng Ʊem chia cho 12 hoĆÆc sinh gioĆ»i ƱaƵ ƱƶƓĆÆc xeĆ”p haĆÆng. CoĆ¹ bao
nhieĆ¢u caĆ¹ch khaĆ¹c nhau ƱeĆ„ thƶĆÆc hieƤn caĆ¹ch chia?
Ta thaĆ”y ngay raĆØng vieƤc tƬm ra lĆ“Ćøi giaĆ»i cho baĆøi toaĆøn seĆ» khoĆ¢ng deĆ£ daĆøng neĆ”u ta khoĆ¢ng
tƬm ra caĆ¹ch thĆ­ch hĆ“ĆÆp ƱeĆ„ tieĆ”p caƤn vĆ“Ć¹i noĆ¹. Ta seƵ tƬm giaĆ»i thuaƤt giaĆ»i baĆøi toaĆøn baĆØng phƶƓng
phaĆ¹p ƱeƤ quy.
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 20 -
a) ThoĆ¢ng soĆ” hoĆ¹a.
Ta seƵ giaĆ»i baĆøi toaĆ¹n Ć“Ć» mĆ¶Ć¹c ƱoƤ toĆ„ng quaĆ¹t : TƬm soĆ” caĆ¹ch chia m vaƤt (phaĆ n thƶƓƻng ) cho n
ƱoĆ”i tƶƓĆÆng (hoĆÆc sinh ) coĆ¹ thĆ¶Ć¹ tƶĆÆ .
GoĆÆi PART laĆø soĆ” caĆ¹ch chia khi ƱoĆ¹ PART laĆø haĆøm cuĆ»a 2 bieĆ”n nguyeĆ¢n m , n ( PART(m
,n )) .
Ta maƵ hoaĆ¹ n ƱoĆ”i tƶƓĆÆng theo thĆ¶Ć¹ tƶĆÆ xeĆ”p haĆÆng 1, 2 , 3 , . . . n ; Si laĆø soĆ” phaĆ n thƶƓƻng maĆø
hoĆÆc sinh i nhaƤn ƱƶƓĆÆc .
Khi ƱoĆ¹ caĆ¹c ƱieĆ u kieƤn raĆøng buoƤc leĆ¢n caĆ¹ch chia laĆø :
Si >= 0
S1 >= S2 >= >= Sn .
S1 + S2 + + Sn = m
VĆ­ duĆÆ :
VĆ“Ć¹i m = 5 , n = 3 ta coĆ¹ 5 caĆ¹ch chia sau :
5 0 0
4 1 0
3 2 0
3 1 1
2 2 1
TĆ¶Ć¹c laĆø PART(5,3 ) = 5
b) CaĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n :
+ m = 0 thƬ seĆ» coĆ¹ duy nhaĆ”t 1 caĆ¹ch chia : moĆÆi hoĆÆc sinh ƱeĆ u nhaƤn ƱƶƓĆÆc 0 phaĆ n
thƶƓƻng .
VaƤy : PART(0 , n ) = 1 vĆ“Ć¹i moĆÆi n
+ n = 0 , m <> 0 thƬ seƵ khoĆ¢ng coĆ¹ caĆ¹ch naĆøo ƱeĆ„ thƶĆÆc hieƤn vieƤc chia .
VaƤy : PART(m , 0 ) = 0 vĆ“Ć¹i moĆÆi m <> 0 .
( ta coĆ¹ theĆ„ thay trƶƓĆøng hĆ“ĆÆp neo PART(m ,0) = 0 hoaĆ«c trƶƓĆøng hĆ“ĆÆp neo PART(m , 1)
= 1 )
c ) PhaĆ¢n raƵ baĆøi toaĆ¹n trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t :
+ m < n khi soĆ” phaĆ n thƶƓng m nhoĆ» hĆ“n soĆ” hoĆÆc sinh n thƬ n - m hoĆÆc sinh xeĆ”p
cuoĆ”i seƵ luoĆ¢n khoĆ¢ng nhaƤn ƱƶƓĆÆc gƬ caĆ» trong moĆÆi caĆ¹ch chia .
VaƤy :
khi n > m thƬ PART(m , n ) = PART(m , m ) .
+ Trong trƶƓĆøng hĆ“ĆÆp m >= n : soĆ” vaƤt chia (phaĆ n thƶƓƻng ) lĆ“Ć¹n hĆ“n hoaĆ«c baĆØng soĆ”
hoĆÆc sinh (ƱoĆ”i tƶƓĆÆng ) ta phaĆ¢n caĆ¹c caĆ¹ch chia laĆøm 2 nhoĆ¹m :
* NhoĆ¹m thĆ¶Ć¹ nhaĆ”t khoĆ¢ng daĆønh cho hoĆÆc sinh xeĆ”p cuoĆ”i cuĆøng phaĆ n thƶƓƻng naĆøo
caĆ»
( Sn = 0 ) . SoĆ” caĆ¹ch chia naĆøy seƵ baĆØng soĆ” caĆ¹ch chia m phaĆ n thƶƓng cho n -1 hoĆÆc sinh .
TĆ¶Ć¹c laĆø : SoĆ” caĆ¹ch chia trong nhoĆ¹m thĆ¶Ć¹ nhaĆ”t = PART(m , n -1 ) .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 21 -
* NhoĆ¹m thĆ¶Ć¹ 2 coĆ¹ phaĆ n cho ngƶƓĆøi cuoĆ”i cuĆøng ( Sn > 0 ) . DeĆ£ thaĆ”y raĆØng soĆ”
caĆ¹ch chia cuĆ»a nhoĆ¹m naĆøy baĆØng soĆ” caĆ¹ch chia m - n phaĆ n thƶƓng cho n hoĆÆc sinh ( vƬ
phƶƓng thĆ¶Ć¹c chia maĆø taĆ”t caĆ» hoĆÆc sinh ƱeĆ u nhaƤn ƱƶƓĆÆc phaĆ n thƶƓƻng coĆ¹ theĆ„ thƶĆÆc hieƤn baĆØng
caĆ¹ch : cho moĆ£i ngƶƓĆøi nhaƤn trĆ¶Ć“Ć¹c 1 phaĆ n thƶƓƻng roĆ i mĆ“Ć¹i chia ).
TĆ¶Ć¹c laĆø : SoĆ” caĆ¹ch chia trong nhoĆ¹m thĆ¶Ć¹ 2 = PART(m - n , n ) .
VaƤy : vĆ“Ć¹i m>= n PART(m , n ) = PART(m , n -1 ) + PART(m - n , n )
d ) DaĆÆng maƵ giaĆ» cuĆ»a haĆøm PART(m , n )
PART(m , n ) = if(m = 0 ) then return 1 ;
else if( n = 1 ) then return 1 ;
else if(m < n ) then return PART(m , m) ;
else return ( PART(m , n -1) + PART(m - n , n ))
e) DaĆÆng haĆøm PART trong NNLT Pascal
Function PART(m , n : integer ) : integer ;
Begin
if ( (m = 0) or ( n = 1) ) then PART := 1
else if(m < n) then PART := PART(m , m )
else PART := PART(m , n -1 ) + PART(m - n , n) ;
End ;
g) DaĆÆng haĆøm PART trong NN LT C++
int PART( int m , int n )
{ if ((m == 0 ) || (n == 0) ) return 1 ;
else if(m < n ) retrun ( PART(m , m )) ;
else return ( PART(m , n -1 ) + PART( m -n , n ) ) ;
}
3. BaĆøi toaĆ¹n tƬm taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² cuĆ»a moƤt daƵy phaĆ n tƶƻ.
BaĆøi toaĆ¹n : XuaĆ”t taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² cuĆ»a daƵy A .
VĆ­ duĆÆ : VĆ“Ć¹i daƵy A goĆ m N = 3 phaĆ n tƶƻ A[1] = a , A[2] = b , A[3] = c thƬ baĆøi
toaĆ¹n baĆ©t phaĆ»i xuaĆ”t 6 hoaĆ¹n vĆ² coĆ¹ theĆ„ cuĆ»a A :
a b c a c b c b a
b a c c a b b c a
VĆ“Ć¹i daƵy A goĆ m N = 4 phaĆ n tƶƻ A[1] = 1 , A[2] = 2 , A[3] = 3 , A[4] =4 thƬ baĆøi toaĆ¹n
baĆ©t phaĆ»i xuaĆ”t 24 hoaĆ¹n vĆ² coĆ¹ theĆ„ cuĆ»a A :
1 2 3 4 1 2 4 3 1 4 3 2 4 2 3 1
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 22 -
2 1 3 4 2 1 4 3 4 1 3 2 2 4 3 1
1 3 2 4 1 4 2 3 1 3 4 2 4 3 2 1
3 1 2 4 4 1 2 3 3 1 4 2 3 4 2 1
3 2 1 4 4 2 1 3 3 4 1 2 3 2 4 1
2 3 1 4 2 4 1 3 4 3 1 2 2 3 4 1
a) ThoĆ¢ng soĆ” hoĆ¹a baĆøi toaĆ¹n .
GoĆÆi HV(v, m ) ( vĆ“Ć¹i v : array[1 . . N ] of T , m :integer ; m ā‰¤ N ; T laĆø moƤt kieĆ„u dƶƵ
lieƤu ƱaƵ bieĆ”t trĆ¶Ć“Ć¹c ) laĆø thuĆ» tuĆÆc xuaĆ”t taĆ”t caĆ» caĆ¹c daĆÆng khaĆ¹c nhau cuĆ»a v coĆ¹ ƱƶƓĆÆc baĆØng caĆ¹ch
hoaĆ¹n vĆ² m thaĆønh phaĆ n ƱaĆ u cuĆ»a daƵy v
VĆ­ duĆÆ : N = 4 , A[1] = 1 , A[2] = 2 , A[3] = 3 , A[4] = 4 thƬ lĆ“Ćøi goĆÆi HV(A ,3 ) xuaĆ”t
taĆ”t caĆ» hoaĆ¹n vĆ² cuĆ»a A coĆ¹ ƱƶƓĆÆc baĆØng caĆ¹ch hoaĆ¹n vĆ² 3 phaĆ n tƶƻ ƱaĆ u ( coĆ¹ 6 h vĆ² ) :
1 2 3 4 1 3 2 4 3 2 1 4
2 1 3 4 3 1 2 4 2 3 1 4
ƑeĆ„ giaĆ»i baĆøi toaĆ¹n ƱaĆ«t ra ban ƱaĆ u ta goĆÆi HV(A,N) ).
b) TrƶƓĆøng hĆ“ĆÆp neo.
VĆ“i m = 1 : HV(v,1) laĆø thuĆ» tuĆÆc giaĆ»i baĆøi toaĆ¹n xuaĆ”t taĆ”t caĆ» caĆ¹c daĆÆng cuĆ»a v coĆ¹ ƱƶƓĆÆc
baĆØng caĆ¹ch hoaĆ¹n vĆ² 1 phaĆ n tuĆ» ƱaĆ u . VaƤy HV(v,1) laĆø thuĆ» tuĆÆc xuaĆ”t v.
HV(v,1) ā‰” print(v) ā‰” for k:= 1 to N do write(v[k])
c) PhaĆ¢n raƵ baĆøi toaĆ¹n.
Ta coĆ¹ theĆ„ tƬm heĆ”t taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² m phaĆ n tƶƻ ƱaĆ u cuĆ»a vector V theo caĆ¹ch sau :
- GiƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m] , . . . ,V[N] hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u (
goĆÆi ƱeƤ quy HV(V ,m - 1) .
- ƑoĆ„i choĆ„ V[m] cho V[m-1] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m],... ,V[N] hoaĆ¹n
vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) .
- ƑoĆ„i choĆ„ V[m] cho V[m-2] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m],ā€¦. ,V[N]
hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . .
- ƑoĆ„i choĆ„ V[m] cho V[2] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m], . .. ,V[N] hoaĆ¹n
vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) .
- ƑoĆ„i choĆ„ V[m] cho V[1] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m], . . . ,V[N] hoaĆ¹n
vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) .
VaƤy :
HV(V,m) ā‰” { SWAP( V[m],V[m] ) ; HV(V,m ā€“ 1) ;
SWAP( V[m],v[m-1] ) ; HV(V,m ā€“ 1) ;
SWAP( V[m],v[m-2 ] ) ; HV(V,m ā€“ 1) ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 23 -
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
SWAP (V[m],v[2] ) ; HV(V,m ā€“ 1) ;
SWAP( V[m],v[1] ) ; HV(V,m ā€“ 1) ;
}
( SWAP(x , y ) laĆø thuĆ» tuĆÆc hoaĆ¹n ƱoĆ„i giaĆ¹ trĆ² cuĆ»a 2 ƱoĆ”i tƶƓĆÆng dƶƵ lieƤu x ,y )
VaƤy :
HV(V , m ) ā‰” for k := m downto 1 do begin
SWAP( V[m], V[k] ) ;
HV(V,m ā€“ 1) ;
end ;
d) ThuĆ» tuĆÆc hoaĆ¹n vĆ² treĆ¢n NNLT Pascal.
. . . . . . . . . . . . . . . . . .
const size = Val ; (* Val laĆø haĆØng gĆ­a trĆ² *)
type vector = array[1. . size] of typebase; (* typebase laĆø moƤt kieĆ„u dƶƵ lieƤu coĆ¹ thĆ¶Ć¹
tƶĆÆ *)
. . . . . . . . . . . . . . . . . . . . . .
procedure Swap( var x , y : typebase ) ;
var t : typebase ;
begin
t := x ; x := y ; y := t ;
end ;
. . . . . . . . . . . . . . . . . . . . . . . . . .
procedure print( A : vector ) ;
var i : integer ;
begin
for i:= 1 to size do write( A[i] : 3 );
writeln ;
end ;
. . . . . . . . . . . . . . . . . . . . . . . . . .
Procedure HV( V : vec tor ; m :integer ) ;
var k : integer ;
begin
if (m = 1 ) then print(V)
else
for k := m downto 1 do begin
Swap(V[m] , V[k]);
HV(V , m ā€“ 1) ;
end ;
end ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 24 -
e) ThuĆ» tuĆÆc hoaĆ¹n vĆ² treĆ¢n NNLT C++ .
. . . . . . . . . . . . . . . . . .
const size = Val ; // Val laĆø haĆØng gĆ­a trĆ²
typedef typebase vector[size] ; // typebase laĆø moƤt kieĆ„u dƶƵ lieƤu coĆ¹ thĆ¶Ć¹ tƶĆÆ
. . . . . . . . . . . . . . . . . . . . . .
void Swap( typebase & x , typebase& y)
{ typebase t ;
t = x ; x = y ; y = t ;
}
. . . . . . . . . . . . . . . . . . . . . . . . . .
void print( const vector &A)
{ for(int j= 0 ; j <size ; j++ ) cout<< A[j] ;
cout << endl ;
}
. . . . . . . . . . . . . . . . . . . . . . . . . .
void HV( const vector &V , int m)
{ if (m == 1 ) print( V );
else for(int k = m-1 ; k > = 0 ; k-- )
{ swap(V[m-1] ,V[k] ) ;
HV(V,m-1) ;
}
}
4. BaĆøi toaĆ¹n saĆ©p xeĆ”p maĆ»ng baĆØng phƶƓng phaĆ¹p troƤn (Sort-Merge).
Yƙ tƶƓƻng : ƑeĆ„ saĆ©p xeĆ”p 1 danh saĆ¹ch goĆ m n phaĆ n tƶƻ baĆØng phƶƓng phaĆ¹p troƤn
ngƶƓĆøi ta chia danh saĆ¹ch thaĆønh 2 phaĆ n (toĆ„ng quaĆ¹t laĆø nhieĆ u phaĆ n ) , saĆ©p xeĆ”p tƶĆøng phaĆ n,
roĆ i troƤn chuĆ¹ng .
BaĆøi toaĆ¹n : saĆ©p theo thĆ¶Ć¹ tƶĆÆ khoĆ¢ng giaĆ»m maĆ»ng a : VectorT baĆØng phƶƓng phaĆ¹p troƤn.
( VectorT = array[1 . . size] of T).
a) ThoĆ¢ng soĆ” hoaĆ¹:
BaĆøi toaĆ¹n ƱƶƓĆÆc khaĆ¹i quaĆ¹t thaĆønh saĆ©p xeĆ”p moƤt daƵy con cuĆ»a daƵy V : VectorT tƶĆø chƦ soĆ”
m ƱeĆ”n chƦ soĆ” n vĆ“Ć¹i 1 <= m <= n <= size . Ta ƱaĆ«t teĆ¢n cho baĆøi toaĆ¹n Ć“Ć» daĆÆng toĆ„ng quaĆ¹t
laĆø : SM(V,m,n).
BaĆøi toaĆ¹n ban ƱaĆ u : saĆ©p daƵy A seĆ» ƱƶƓĆÆc thƶĆÆc hieƤn baĆØng lĆ“Ćøi goĆÆi : SM(A ,1,size).
b) TrƶƓĆøng hĆ“ĆÆp taĆ m thƶƓĆøng:
ƑoĆ¹ laĆø khi n = m (daƵy saĆ©p chƦ coĆ¹ 1 phaĆ n tƶƻ ), khi ƱoĆ¹ khoĆ¢ng caĆ n laĆøm gƬ caĆ» (thao taĆ¹c
roĆ£ng) .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 25 -
c) PhaĆ¢n raƵ trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t :
Khi n > m ta thƶĆÆc hieƤn caĆ¹c coĆ¢ng vieƤc sau :
+ Chia daƵy : a[m] ,a[m+1], . . . , a[n] thaĆønh 2 daƵy con
a[m] , . . , a[l] vaĆø a[l+1] , . . . , a[n]
+ SaĆ©p xeĆ”p tƶĆøng daƵy con thaĆønh caĆ¹c daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ theo giaĆ»i thuaƤt SM .
+ TroƤn 2 daƵy con coĆ¹ thĆ¶Ć¹ tƶĆÆ laĆÆi thaĆønh daƵy a[m] ,. . . , a[n] mĆ“Ć¹i coĆ¹ thĆ¶Ć¹ tƶĆÆ .
ƑeĆ„ thƶĆÆc hieƤn vieƤc troƤn hai daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ thaĆønh moƤt daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ ta seƵ duĆøng moƤt
thuĆ» tuĆÆc khoĆ¢ng ƱeƤ quy Merge(m , l , n) . Ta caĆ n choĆÆn l ƱeĆ„ ƱƶƓĆÆc 2 daƵy con giaĆ»m haĆ¼n
kĆ­ch thĆ¶Ć“Ć¹c so vĆ“Ć¹i daƵy ban ƱaĆ u , tĆ¶Ć¹c laĆø choĆÆn l : m < l < l+1 < n .
ThƶƓng choĆÆn l laĆø phaĆ n tƶƻ ā€œgiƶƵa ā€œ : l = ( m + n ) div 2 .
ThuĆ» tuĆÆc Sort_Merge(m,n) treĆ¢n maĆ»ng V : VectorT vieĆ”t treĆ¢n ngoĆ¢n ngƶƵ PASCAL
coĆ¹ daĆÆng :
procedure SM (var d: VectorT ; m,n: index);
var l : index ;
begin
if n>m then
begin
l := (m+n) div 2;
SM (d,m,l) ;
SM (d,l+1,n) ;
Merge (d,m,l,n) ;
end ;
end ;
Trong ƱoĆ¹ SM laĆø thuĆ» tuĆÆc troƤn 2 daƵy taĆŖng ƱeĆ„ ƱƶƓĆÆc moƤt daƵy taĆŖng.
ƑeĆ„ saĆ©p maĆ»ng A (daƵy A[1:size]) ta goĆÆi SM(A ,1,size)
5. BaĆøi toaĆ¹n tƬm nghieƤm xaĆ”p xƦ cuĆ»a phƶƓng trƬnh f(x)=0 .
BaĆøi toaĆ¹n : HaĆøm f(x) lieĆ¢n tuĆÆc treĆ¢n ƱoaĆÆn [ao,bo] , tƬm moƤt nghieƤm xaĆ”p xƦ vĆ“Ć¹i ƱoƤ chĆ­nh
xaĆ¹c Īµ treĆ¢n [ao,bo] cuĆ»a phƶƓng trƬnh f(x) = 0.
Yƙ tƶƓƻng cuĆ»a giaĆ»i thuaƤt :
- TrƶƓĆøng hĆ“ĆÆp neo : bo - ao < Īµ
+ NeĆ”u f(ao).f(bo) ā‰¤ 0 thƬ haĆøm f coĆ¹ nghieƤm treĆ¢n [ao,bo] .VaĆø vƬ ta Ʊang tƬm
nghieƤm xaĆ”p xƦ vĆ“Ć¹i ƱoƤ chĆ­nh xaĆ¹c Īµ neĆ¢n ao laĆø nghieƤm xaĆ”p xƦ caĆ n tƬm .
+ NeĆ”u f(ao).f(bo) > 0 thƬ ta xem nhƶ khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ treĆ¢n ƱoaĆÆn xeĆ¹t.
- TrƶƓng hĆ“ĆÆp bo - ao ā‰„ Īµ thƬ chia ƱoĆ¢i ƱoaĆÆn [ao,bo] roĆ i tƬm laĆ n lƶƓĆÆt nghieƤm treĆ¢n
tƶĆøng ƱoaĆÆn con : ƱoaĆÆn con traĆ¹i, ƱoaĆÆn con phaĆ»i .
Ta seƵ xaĆ¢y dƶĆÆng moƤt haĆøm ƱeƤ qui traĆ» veĆ  giaĆ¹ trĆ² laĆø nghieƤm xaĆ”p xƦ cuĆ»a f (neĆ”u
coĆ¹),hay moƤt haĆØng E ( ƱuĆ» lĆ“Ć¹n) neĆ”u f khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ treĆ¢n [ao,bo] .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 26 -
a) ThoĆ¢ng soĆ” hoaĆ¹:
XeĆ¹t haĆøm ROOT vĆ“Ć¹i 3 thoĆ¢ng soĆ” laĆø g , a,b ,(ROOT(g,a,b)) traĆ» veĆ  giaĆ¹ trĆ² nghieƤm xaĆ”p xƦ Īµ
cuĆ»a phƶƓng trƬnh g(x) =0 treĆ¢n ƱoaĆÆn [a,b] hoaĆ«c giaĆ¹ trĆ² C neĆ”u phƶƓng trƬnh xeĆ¹t khoĆ¢ng
coĆ¹ nghieƤm xaĆ”p xƦ . ƑeĆ„ giaĆ»i baĆøi toaĆ¹n ban ƱaĆ”u ta goĆÆi haĆøm ROOT(f,ao,bo) .
b) TrƶƓĆøng hĆ“ĆÆp taĆ m thƶƓĆøng:
ƱoĆ¹ laĆø khi b - a < epsilon .
Khi ƱoĆ¹ :
if ( g(a).g(b) ) <= 0 then ROOT(g,a,b) = a ; // a laĆø nghieƤm xaĆ”p xƦ
else ROOT(g,a,b) = E ; // khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ
c) PhaĆ¢n raƵ trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t:
khi b - a >= Īµ ta phaĆ¢n [a,b] laĆøm 2 ƱoaĆÆn [a,c] vaĆø [c,b] vĆ“Ć¹i c = (a + b) / 2.
- NeĆ”u ROOT(g , a ,c) < E thƬ ROOT(g , a , b ) = ROOT(g ,a ,c) (baĆøi toaĆ¹n tƬm
nghieƤm treĆ¢n ƱoaĆÆn [a,c] ) .
- coĆøn khoĆ¢ng thƬ ROOT(g , a , b ) = ROOT(g ,c ,b) (baĆøi toaĆ¹n tƬm nghieƤm treĆ¢n
ƱoaĆÆn [c ,b] ) .
d) HaĆøm tƬm nghieƤm xaĆ”p xƦ treĆ¢n NN Pascal coĆ¹ daĆÆng:
const epsilon = ;
E = ;
Function ROOT(a,b :real ) :real ;
var c , R : real ;
begin
if ((b-a) < epsilon ) then if ( f(a)*f(b) <= 0 ) then ROOT := a
else ROOT := L
else
begin
c := (a + b)/2 ;
if ( ROOT(a ,c ) < E ) then ROOT := ROOT(a,c)
else ROOT := ROOT(c,b)
end;
e) ChƶƓng trƬnh con tƬm nghieƤm xaƔp xƦ trong NN LT C++
const double epsilon = ;
const double E = ;
double ROOT(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 ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 27 -
double R = ROOT(a,c) ;
if( R< E ) return R ;
else return ( ROOT(c , b) ) ;
}
}
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 28 -
CHƖƔNG III
KHƖƛ ƑEƄ QUY
I. CƔ CHEƁ THƖƏC HIEƄN GIAƛI THUAƄT ƑEƄ QUY.
TraĆÆng thaĆ¹i cuĆ»a tieĆ”n trƬnh xƶƻ lyĆ¹ moƤt giaĆ»i thuaƤt Ć“Ć» moƤt thĆ“Ćøi ƱieĆ„m ƱƶƓĆÆc ƱaĆ«c trƶng bĆ“Ć»i
noƤi dung caĆ¹c bieĆ”n vaĆø leƤnh caĆ n thƶĆÆc hieƤn keĆ” tieĆ”p. VĆ“Ć¹i tieĆ”n trƬnh xƶƻ lyĆ¹ moƤt giaĆ»i thuaƤt
ƱeƤ qui Ć“Ć» tƶĆøng thĆ“Ćøi ƱieĆ„m thƶĆÆc hieƤn, con caĆ n lƶu trƶƵ caĆ» caĆ¹c traĆÆng thaĆ¹i xƶƻ lyĆ¹ Ʊang coĆøn
dang dƓƻ .
a) XeĆ¹t giaĆ»i thuaƤt ƱeƤ quy tĆ­nh giai thƶĆøa:
FAC ( n ) ā‰” if(n = 0 ) then retrun 1 ;
else retrun ( n * FAC (n ā€“ 1)) ;
SĆ“ ƱoĆ  quaĆ¹ trƬnh tĆ­nh gĆ­a trĆ² 3 ! theo giaĆ»i thuaƤt ƱeƤ quy :
FAC(3 ) = 3 * FAC( 2 )
FAC( 0 ) = 1
FAC( 1 ) = 1 * FAC( 0
FAC( 2 ) = 2 * FAC( 1
Khi thƶĆÆc hieƤn lĆ“Ćøi goĆÆi FAC (3 ) seĆ» phaĆ¹t sinh loĆøi goĆÆi FAC (2 ) , ƱoĆ ng thĆ“Ćøi phaĆ»i lƶu giƶƵ
thoĆ¢ng tin traĆÆng thaĆ¹i xƶƻ lyĆ¹ coĆøn dang doĆ» ( FAC ( 3 ) = 3 * FAC ( 2 ) ) . ƑeĆ”n lƶƓĆÆt mƬnh
lĆ“Ćøi goĆÆi FAC ( 2 ) laĆÆi laĆøm phaĆ¹t sinh lĆ“Ćøi goĆÆi FAC (1 ) ,ƱoĆ ng thĆ“Ćøi vaĆ„n phaĆ»i lƶu trƶƻ thoĆ¢ng
tin traĆÆng thaĆ¹i xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» ( FAC (2 ) = 2 * FAC ( 1 ) ) ,.. . CĆ¶Ć¹ nhƶ vaƤy cho tĆ“Ć¹i
khi gaĆ«p lĆ“Ćøi goĆÆi
trƶƓĆøng hĆ“ĆÆp neo ( FAC (0 ) = 1 ) .
TieĆ”p sau quĆ¹a trƬnh goĆÆi laĆø moƤt quĆ¹a trƬnh xƶƻ lyĆ¹ ngƶƓĆÆc ƱƶƓĆÆc thƶĆÆc hieƤn :
- DuĆøng giaĆ¹ trĆ² FAC ( 0 ) ƱeĆ„ tĆ­nh FAC ( 1 ) theo sĆ“ ƱoĆ  xƶƻ lyĆ¹ coĆøn lƶu trƶƻ .
- DuĆøng giaĆ¹ trĆ² FAC ( 1 ) ƱeĆ„ tĆ­nh FAC ( 2 ) theo sĆ“ ƱoĆ  xƶƻ lyĆ¹ coĆøn lƶu trƶƻ .
- DuĆøng giaĆ¹ trĆ² FAC ( 2 ) ƱeĆ„ tĆ­nh FAC ( 3 ) theo sĆ“ ƱoĆ  xƶƻ lyĆ¹ coĆøn lƶu trƶƻ .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 29 -
ƑoĆ ng thĆ“Ćøi vĆ“Ć¹i quĆ¹a trƬnh xƶƻ lyĆ¹ ngƶƓĆÆc laĆø quĆ¹a trƬnh xoĆ¹a boĆ» caĆ¹c thoĆ¢ng tin veĆ  giaĆ»i thuaƤt xƶƻ
lyĆ¹ trung gian ( quĆ¹a trƬnh thu hoĆ i vuĆøng nhĆ“Ć¹ ) .
b) XeĆ¹t giaĆ»i thuaƤt ƱeƤ quy tĆ­nh giaĆ¹ trĆ² haĆøm FIBONACCI .
FIB(n) if ((n = 0 ) or ( n = 1 )) then return 1 ;ā‰”
else return ( FIB(n - 1) + FIB(n - 2)) ;
SƓ ƱoƠ tƭnh FIB(5) :
FIB(3) = FIB(1) + FIB(2) FIB(4) = FIB(2) + FIB(3)
FIB(5) = FIB(3) + FIB
( )
FIB(2) = FIB(0) + FIB(1)
FIB(0) = FIB(1) =
FIB(2) = FIB(0) + FIB(1)
FIB(0) = 1 FIB(1) =
FIB(2) = FIB(0) + FIB(1)
FIB(1) =
FIB(1) =
FIB(3) = FIB(2) + FIB(1)FIB(1) =
FIB(0) =
c) XeĆ¹t thuĆ» tuĆÆc ƱeƤ quy thaĆ¹p HaĆø NoƤi THN (n , X , Y , Z)
THN (n : integer ; X ,Y , Z : char)
ā‰” if (n > 0 ) then
{ THN(n-1,X ,Z ,Y) ;
Move(X, Z) ;
THN(n-1,Y,X,Z) ;
}
ƑeĆ„ chuyeĆ„n 3 Ć±Ć³a tƶĆø coƤt A sang coƤt C duĆøng coƤt B laĆøm trung gian ta goĆÆi : THN
(3,A,B,C)
SĆ“ ƱoĆ  thƶĆÆc hieƤn lĆ“Ćøi goĆÆi THN (3,A,B,C) laĆø :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 30 -
LĆ“Ćøi goĆÆi c/0 LĆ“Ć¹i goĆÆi c/1 LĆ“Ćøi goĆÆi c/2 LĆ“Ćøi goĆÆi c/3
THN(0,A,C,B)
THN(1,A,B,C) A ---> C
THN(0,B,A,C)
THN(2,A,C,B) A ---> B
THN(0,C,B,A)
THN(1,C,A,B) C --->B
THN(0,A,C,B)
THN(3,A,B,C) A ---> C
THN(0,B,A,C)
THN(1,B,C,A) B ---> A
THN(0,C,B,A)
THN(2,B,A,C) B ---> C
THN(0,A,C,B)
THN(1,A,B,C) A ---> C
THN(0,B,A,C)
VĆ“Ć¹i THN(0 ,X , Y , Z ) laĆø trƶƓĆøng hĆ“ĆÆp neo tƶƓng Ć¶Ć¹ng vĆ“Ć¹i thao taĆ¹c roĆ£ng .
X ------> Y laĆø thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Y (MOVE(X,Y)).
CaĆ¹c bĆ¶Ć“Ć¹c chuyeĆ„n Ć±Ć³a seĆ» laĆø :
A --> C ; A --> B ; C --> B ; A --> C ; B --> A ; B --> C ; A --> C ;
LĆ“Ćøi goĆÆi caĆ”p 0 :
THN(3 , A , B , C ) seĆ» laĆøm naĆ»y sinh hai lĆ“Ćøi goĆÆi caĆ”p 1 : THN (2 ,A, C, B) ;
THN (2 , B , A , C ) cuĆøng vĆ“Ć¹i caĆ¹c thoĆ¢ng tin cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» .
CaĆ¹c lĆ“Ćøi goĆÆi caĆ”p 1 :
THN(2 , A , C , B ) , THN (2 , B , A ,C ) seĆ» laĆøm naĆ»y sinh caĆ¹c lĆ“Ćøi goĆÆi caĆ”p 2 :
THN (1 ,A, B, C) ; THN (1, C , A , B ) ; THN (1 ,B, C, A) ; THN (1, A , B , C ) ; cuĆøng
vĆ“Ć¹i caĆ¹c thoĆ¢ng tin cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» .
CaĆ¹c lĆ“Ćøi goĆÆi caĆ”p 2 :
THN(1 ,A, B, C) ; THN(1, C , A , B ) ; THN(1 ,B, C, A) ; THN(1, A , B , C ) ;
seĆ» laĆøm naĆ»y sinh caĆ¹c lĆ“Ćøi goĆÆi caĆ”p 3 daĆÆng : THN(0 ,X, Y, Z) (thao taĆ¹c roĆ£ng tƶƓng Ć¶Ć¹ng vĆ“Ć¹i
trƶƓĆøng hĆ“ĆÆp suy bieĆ”n ); cuĆøng vĆ“Ć¹i caĆ¹c thoĆ¢ng tin cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» .
QuaĆ¹ trƬnh goĆÆi dƶĆøng laĆÆi khi gaĆ«p trƶƓĆøng hĆ“ĆÆp suy bieĆ”n .
QuĆ¹a trƬnh xƶƻ lyĆ¹ ngƶƓĆÆc vĆ“Ć¹i quaĆ¹ trƬnh goĆÆi baĆ©t ƱaĆ u khi thƶĆÆc hieƤn xong caĆ¹c trƶƓĆøng hĆ“ĆÆp neo
nhaĆØm hoaĆøn thieƤn caĆ¹c bĆ¶Ć“Ć¹c xƶƻ lyĆ¹ con dang dĆ“Ć» song song vĆ“Ć¹i quaĆ¹ trƬnh hoaĆøn thieƤn caĆ¹c lĆ“Ćøi
goĆÆi laĆø quĆ¹a trƬnh loaĆÆi boĆ» caĆ¹c lƶu trƶƻ thoĆ¢ng tin giaĆ»i thuaƤt trung gian.
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 31 -
Do ƱaĆ«c ƱieĆ„m cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ moƤt giaĆ»i thuaƤt ƱeƤ quy laĆø : vieƤc thƶĆÆc thi lĆ“Ćøi goĆÆi ƱeƤ
quy sinh ra lĆ“Ćøi goĆÆi ƱeƤ quy mĆ“Ć¹i cho ƱeĆ”n khi gaĆ«p trƶƓĆøng hĆ“ĆÆp suy bieĆ”n (neo ) cho neĆ¢n ƱeĆ„
thƶĆÆc thi giaĆ»i thuaƤt ƱeƤ quy caĆ n coĆ¹ cĆ“ cheĆ” lƶu trƶƻ thoĆ¢ng tin thoĆ»a caĆ¹c yeĆ¢u caĆ u sau :
+ Ɣƛ moĆ£i laĆ n goĆÆi phaĆ»i lƶu trƶƵ thoĆ¢ng tin traĆÆng thaĆ¹i con dang dĆ“Ć» cuĆ»a tieĆ”n trƬnh
xƶƻ lyĆ¹ Ć“Ć» thĆ“Ćøi ƱieĆ„m goĆÆi. SoĆ” traĆÆng thaĆ¹i naĆøy baĆØng soĆ” laĆ n goĆÆi chƶa ƱƶƓĆÆc hoaĆøn taĆ”t .
+ Khi thƶĆÆc hieƤn xong (hoaĆøn taĆ”t) moƤt laĆ n goĆÆi, caĆ n khoĆ¢i phuĆÆc laĆÆi toaĆøn boƤ
thoĆ¢ng tin traĆÆng thaĆ¹i trĆ¶Ć“Ć¹c khi goĆÆi .
+ LeƤnh goĆÆi cuoĆ”i cuĆøng (Ć¶Ć¹ng vĆ“Ć¹i trƶƓng hĆ“ĆÆp neo) seƵ ƱƶƓĆÆc hoaĆøn taĆ”t ƱaĆ u tieĆ¢n ,
thĆ¶Ć¹ tƶĆÆ daƵy caĆ¹c leƤnh goĆÆi ƱƶƓĆÆc hoaĆøn taĆ”t ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ goĆÆi, tƶƓng Ć¶Ć¹ng daƵy thoĆ¢ng tin
traĆÆng thaĆ¹i ƱƶƓĆÆc hoĆ i phuĆÆc theo thĆ¶Ć¹ tƶĆÆ ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ lƶu trƶƻ .
CaĆ”u truĆ¹c dƶƵ lieƤu cho pheĆ¹p lƶu trƶƵ daƵy thoĆ¢ng tin thoĆ»a 3 yeĆ¢u caĆ u treĆ¢n laĆø caĆ”u truĆ¹c lƶu trƶƻ
thoĆ»a luaƤt LIFO (Last In Firt Out ) . MoƤt kieĆ„u caĆ”u truĆ¹c lƶu trƶƻ thƶƓĆøng ƱƶƓĆÆc sƶƻ duĆÆng
trong trƶƓĆøng hĆ“ĆÆp naĆøy laĆø caĆ”u truĆ¹c choĆ ng (stack).
VĆ“Ć¹i moƤt choĆ ng S thƶƓĆøng cho pheĆ¹p chuĆ¹ng ta thƶĆÆc hieƤn caĆ¹c thao taĆ¹c sau treĆ¢n noĆ¹ :
- ThuĆ» tuĆÆc Creatstack(S) : TaĆÆo choĆ ng S roĆ£ng .
- ThuĆ» tuĆÆc Push(x,S) : Lƶu trƶƵ theĆ¢m dƶƵ lieƤu x vaĆøo Ć±Ć³nh stack S
( x laĆø dƶƵ lieƤu kieĆ„u ƱƓn giaĆ»n giaĆ»n hoaĆ«c coĆ¹ caĆ”u truĆ¹c )
- ThuĆ» tuĆÆc Pop(x,S) : LaĆ”y giaĆ¹ trĆ² Ʊang lƶu Ć“Ć» Ć±Ć³nh S chĆ¶Ć¹a vaĆøo trong ƱoĆ”i tƶƓĆÆng dƶƵ
lieƤu x vaĆø loaĆÆi boĆ» giaĆ¹ trĆ² naĆøy khoĆ»i S ( luĆøi ƱƦnh S xuoĆ”ng moƤt mĆ¶Ć¹c ) .
- HaĆøm Empty(S) : ( kieĆ„u boolean ) KieĆ„m tra tĆ­nh roĆ£ng cuĆ»a S : cho giaĆ¹ trĆ² ƱuĆ¹ng
neĆ”u S roĆ£ng , sai neĆ”u S khoĆ¢ng roĆ£ng .
CaĆøi ƱaĆ«t cuĆÆ theĆ„ cuĆ»a S coĆ¹ theĆ„ thƶĆÆc hieƤn baĆØng nhieĆ u phƶƓng phaĆ¹p phuĆÆ thuoƤc vaĆøo tƶĆøng
ngoĆ¢n ngƶƵ laƤp trƬnh vaĆø tƶĆøng muĆÆc Ʊƭch sƶƻ duĆÆng cuĆÆ theĆ„ .
VĆ­ duĆÆ :
CaĆøi ƱaĆ«t ( baĆØng caĆ”u truĆ¹c maĆ»ng ) choĆ ng S maĆø moĆ£i phaĆ n tƶƻ laĆø moƤt ƱoĆ”i tƶƓĆÆng dƶƵ lieƤu
thuoƤc kieƄu T trong PASCAL nhƶ sau :
Const sizestack = . . . ;
Type stackType = record
St : array [1 . . sizestack ] of T ;
Top : 0 . . sizestack ;
end ;
ThuĆ» tuĆÆc Creatstack(S) : taĆÆo choĆ ng S roĆ£ng :
Procedure Creatstack( var S : StackType )
Begin
S.Top := 0 ;
End;
ThuĆ» tuĆÆc Push(x,S) : CheĆøn - Lƶu trƶƵ theĆ¢m dƶƵ lieƤu x vaĆøo Ć±Ć³nh stack S
( x laĆø dƶƵ lieƤu kieĆ„u ƱƓn giaĆ»n giaĆ»n hoaĆ«c coĆ¹ caĆ”u truĆ¹c )
Procedure Push( var S : StackType ; x : T) ;
Begin
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 32 -
S.St[S.Top +1] := x ;
S.Top := S.Top + 1 ;
End;
ThuĆ» tuĆÆc Pop(x,S) : XoĆ¹a - LaĆ”y giaĆ¹ trĆ² Ʊang lƶu Ć“Ć» Ć±Ć³nh S chĆ¶Ć¹a vaĆøo trong ƱoĆ”i
tƶƓĆÆng dƶƵ lieƤu x vaĆø loaĆÆi boĆ» giaĆ¹ trĆ² naĆøy khoĆ»i S ( luĆøi ƱƦnh S xuoĆ”ng moƤt mĆ¶Ć¹c ) .
Procedure Pop( var S : StackType ; var x : T ) ;
Begin
x := S.St[S.Top] ;
S.Top := S.Top - 1 ;
End;
HaĆøm Empty(S) : ( HaĆøm boolean ) KieĆ„m tra tĆ­nh roĆ£ng cuĆ»a Stack S
Function Empty( S : StackType ) : boolean ;
Begin
Empty := ( S.Top = 0 ) ;
End ;
MoĆ¢ hƬnh stack S vaĆø taĆ¹c duĆÆng caĆ¹c thao taĆ¹c treĆ¢n noĆ¹ .
ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“
ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“
ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“
3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“
2 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 2 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 2 ā€“ā€“ x 1 ā€“ā€“ā€“ 2 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“
1 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 1 ā€“ā€“ā€“x o ā€“ā€“ 1 ā€“ā€“ā€“x o ā€“ā€“ā€“ā€“ 1 ā€“ā€“ā€“x o ā€“ā€“ā€“ā€“
Createstack(S) ; Push(S, xo ) ; Push(S,x1 ) ; pop(S,y)
( S.top = 0 ) S.St[1] := xo S.St[2] := x1 y := x1
S.top := 1 S.top := 2 S.Top := 1 ;
NNLT PASCAL vaĆø C++ thƶĆÆc hieƤn ƱƶƓĆÆc cĆ“ cheĆ” ƱeƤ qui nhĆ“Ćø trong quaĆ¹ trƬnh bieĆ¢n dĆ²ch,
phaĆ n meĆ m ngoĆ¢n ngƶƵ tƶĆÆ Ć±oƤng phaĆ¹t sinh ra caĆ”u truĆ¹c stack ƱeĆ„ quaĆ»n lyĆ¹ caĆ¹c leƤnh goĆÆi
chƶƓng trƬnh con. Khi moƤt leƤnh goĆÆi chƶƓng trƬnh con thƶĆÆc hieƤn, caĆ¹c bieĆ”n Ć±Ć²a phƶƓng
(goĆ m caĆ» caĆ¹c thoĆ¢ng soĆ”) seƵ ƱƶƓĆÆc caĆ”p phaĆ¹t vuĆøng nhĆ“Ć¹ mĆ“Ć¹i Ć“Ć» ƱƦnh stack. NhĆ“Ćø vaƤy caĆ¹c taĆ¹c
ƱoƤng Ć±Ć²a phƶƓng cuĆ»a thuĆ» tuĆÆc seƵ khoĆ¢ng laĆøm thay ƱoĆ„i caĆ¹c traĆÆng thaĆ¹i xƶƻ lyĆ¹ coĆøn dang dĆ“Ć».
II. TOƅNG QUAN VEƀ VAƁN ƑEƀ KHƖƛƻ ƑEƄ QUY.
ƑeƤ quy laĆø phƶƓng phaĆ¹p giuĆ¹p chuĆ¹ng ta tƬm giaĆ»i thuaƤt cho caĆ¹c baĆøi toaĆ¹n khoĆ¹ . GiaĆ»i
thuaƤt giaĆ»i baĆøi toaĆ¹n baĆØng ƱeƤ quy thƶƓĆøng raĆ”t ƱeĆÆp (goĆÆn gaĆøng, deĆ£ hieĆ„u ,deĆ£ chuyeĆ„n thaĆønh
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 33 -
chƶƓng trƬnh treĆ¢n caĆ¹c NNLT) . Nhƶng nhƶ ƱaƵ chƦ ra Ć“Ć» treĆ¢n vieƤc xƶƻ lyĆ¹ giaĆ»i thuaƤt ƱeƤ quy
laĆÆi thƶƓĆøng gaĆ¢y khoĆ¹ khaĆŖn cho maĆ¹y tĆ­nh (toĆ”n khoĆ¢ng gian nhĆ“Ć¹ vaĆø thĆ“Ćøi gian xƶƻ lyĆ¹), hĆ“n nƶƵa
khoĆ¢ng phaĆ»i moĆÆi NNLT ƱeĆ u cho pheĆ¹p maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy (vĆ­ duĆÆ : FORTRAN) . VƬ
vaƤy vieƤc thay theĆ” moƤt chƶƓng trƬnh ƱeƤ quy ( coĆ¹ chĆ¶Ć¹a chƶƓng trƬnh con ƱeƤ quy ) baĆØng
moƤt chƶƓng trƬnh khoĆ¢ng ƱeƤ quy cuƵng laĆø moƤt vaĆ”n ƱeĆ  ƱƶƓĆÆc quan taĆ¢m nhieĆ u trong laƤp
trƬnh .
MoƤt caĆ¹ch toĆ„ng quaĆ¹t ngƶƓĆøi ta ƱaƵ chƦ ra raĆØng : MoĆÆi giaĆ»i thuaƤt ƱeƤ quy ƱeĆ u coĆ¹ theĆ„ thay
theĆ” baĆØng moƤt giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy . VaĆ”n ƱeĆ  coĆøn laĆÆi laĆø kyƵ thuaƤt xaĆ¢y dƶĆÆng giaĆ»i thuaƤt
khoĆ¢ng ƱeƤ quy tƶƓng Ć¶Ć¹ng thay theĆ” giaĆ»i thuaƤt ƱeƤ quy . RaĆ”t ƱaĆ¹ng tieĆ”c vieƤc xaƤy dƶĆÆng giaĆ»i
thuaƤt khoĆ¢ng ƱeƤ quy thay theĆ” cho moƤt giaĆ»i thuaƤt ƱeƤ quy ƱaƵ coĆ¹ laĆÆi laĆø moƤt vieƤc khoĆ¢ng
phaĆ»i bao giĆ“Ćø cuƵng ƱƓn giaĆ»n vaĆø ƱeĆ”n nay vaĆ£n chƶa coĆ¹ giaĆ»i phaĆ¹p thoĆ»a ƱaĆ¹ng cho trƶƓĆøng
hĆ“ĆÆp toĆ„ng quaĆ¹t.
SĆ“ ƱoĆ  ƱeĆ„ xaĆ¢y dƶĆÆng chƶƓng trƬnh cho moƤt baĆøi toaĆ¹n khoĆ¹ khi ta khoĆ¢ng tƬm ƱƶƓĆÆc giaĆ»i
thuaƤt khoĆ¢ng ƱeƤ quy thƶƓĆøng laĆø :
+ DuĆøng quan nieƤm ƱeƤ quy ƱeĆ„ tƬm giaĆ»i thuaƤt cho baĆøi toaĆ¹n .
+ MaƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy .
+ Khƶƻ ƱeƤ quy ƱeĆ„ coĆ¹ ƱƶƓĆÆc moƤt chƶƓng trƬnh khoĆ¢ng ƱeƤ quy .
Tuy nhieĆ¢n do vieƤc khƶƻ ƱeƤ quy khoĆ¢ng phaĆ»i bao giĆ“Ćø cuƵng deĆ£ vaĆø vƬ vaƤy trong nhieĆ u
trƶƓĆøng hĆ“ĆÆp ta cuƵng phaĆ»i chaĆ”p nhaƤn sƶ duĆÆng chƶƓng trƬnh ƱeƤ quy .
III. CAƙC TRƖƔƘNG HƔƏP KHƖƛ ƑEƄ QUY ƑƔN GIAƛN.
1. CaĆ¹c trƶƓĆøng hĆ“ĆÆp khƶƻ ƱeƤ quy baĆØng voĆøng laĆ«p .
a) HaĆøm tĆ­nh gĆ­a tri cuĆ»a daƵy dƶƵ lieƤu moĆ¢ taĆ» baĆØng hoĆ i quy .
a1) Yƙ tƶƓƻng daĆ£n daĆ©t :
XeĆ¹t moƤt voĆøng laĆ«p trong ƱoĆ¹ sƶƻ duĆÆng 1 taƤp hĆ“ĆÆp bieĆ”n W = (V , U ) goĆ m taƤp hĆ“ĆÆp U
caĆ¹c bieĆ”n bĆ² thay ƱoĆ„i trong voĆøng laĆ«p vaĆø V laĆø caĆ¹c bieĆ”n coĆøn laĆÆi.
DaĆÆng toĆ„ng quaĆ¹t cuĆ»a voĆøng laĆ«p laĆø :
W := Wo ; { Wo = ( Uo,Vo) }
while C(U) do U := g(W) (3.1.1)
GoĆÆi Uo laĆø traĆÆng thaĆ¹i cuĆ»a U ngay trĆ¶Ć“Ć¹c voĆøng laĆ«p , Uk vĆ“Ć¹i k >0 laĆø traĆÆng thaĆ¹i cuĆ»a U
sau laĆ n laĆ«p thĆ¶Ć¹ k (giaĆ» sƶƻ coĆøn laĆ«p ƱeĆ”n laĆ n k ) .
Ta coĆ¹ :
Uo mang caĆ¹c giaĆ¹ trĆ² ƱƶƓĆÆc gaĆ¹n ban ƱaĆ u
Uk = g(W) = g(Uk-1 , Vo ) = f(uk-1) vĆ“Ć¹i k = 1 .. n (3.1.2)
VĆ“Ć¹i n laĆø laĆ n laĆ«p cuoĆ”i cuĆøng , tĆ¶Ć¹c C(Uk ) ƱuĆ¹ng vĆ“Ć¹i moĆÆi k < n , C(Un) sai
Sau voĆøng laĆ«p W mang noƤi dung (Un ,Vo ) .
Ta thaĆ”y : ƱeĆ„ tĆ­nh gĆ­a trĆ² daƵy ƱƶƓĆÆc Ć±Ć²nh nghĆ³a bĆ“Ć»i quan heƤ hoĆ i quy daĆÆng (3.1.2) ta
coĆ¹ theĆ„ duĆøng giaĆ»i thuaƤt laĆ«p moĆ¢ taĆ» bĆ“Ć»i ƱoaĆÆn leƤnh (3.1.1) .
a2) GiaĆ»i thuaƤt tĆ­nh gĆ­a trĆ² cuĆ»a daƵy hoĆ i quy thƶƓĆøng gaĆ«p daĆÆng :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 34 -
f(n) = C khi n = no ( C laĆø moƤt haĆØng )
= g(n,f(n -1)) khi n > no
VĆ­ duĆÆ :
HaĆøm giai thƶĆøa FAC (n) = n ! = 1 khi n = 0
= n * FAC(n - 1) khi n > 0
ToĆ„ng n soĆ” ƱaĆ u tieĆ¢n cuĆ»a daƵy Ʊan daĆ”u sau :
Sn = 1 - 3 + 5 - 7 .. + (-1)n+1
* (2n-1)
S(k) = 1 khi k =1
= S(k-1) + (- 1)k+1
*(2*k-1) vĆ“Ć¹i k > 1
- GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh giaĆ¹ trĆ² f(n)
f(n) = if(n = no) then return C ;
else return (g(n,f(n -1)) ;
- GiaĆ»i thuaƤt laĆ«p tĆ­nh giaĆ¹ tri f(n)
k := no ; F := C ;
{ F = f(no) }
While( k < n ) do begin
k := k +1 ;
F := g(k,F ) ;
end ; }
{ F = f(n) }
Hoaƫc : F := C ;
For k := no to n -1 do begin
k := k + 1 ;
F := g(k,F) ;
end ;
Trong trƶƓĆøng hĆ“ĆÆp naĆøy :
W = U = ( k ,F )
Wo = Uo = ( no,C )
C(U) = ( k < n)
f(W) = f(U) = f(k,F) = (k+1,g(k,F)))
VĆ­ duĆÆ 1: HaĆøm tĆ­nh FAC(n) = n! khoĆ¢ng ƱeƤ quy
+ Trong NN LT PASCAL
Function FAC ( n : integer ) : longint ;
var k : integer ;
F : longint ;
Begin
F := 1 ; k := 0 ;
while (k < n ) do begin
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 35 -
k := k + 1 ;
F := F * k ;
end ;
FAC := F ;
end ;
hoaƫc :
Function FAC ( n : integer ) : longint ;
var k : integer ;
F : longint ;
Begin
F := 1 ;
For k:= 1 to n do F := F * k ;
FAC := F ;
end ;
+ Trong NN LT C++
long int FAC ( int n )
{ int k = 0 ;
long int F = 1 ;
while ( k < n ) F = ++k * F ;
return (F) ;
}
Hoaƫc :
long int FAC ( int n )
{ long int F = 1 ;
for ( int k = 1; k <= n ; k++) F = k * F ;
return (F) ;
}
VĆ­ du 2 : DaĆÆng haĆøm Sn khoĆ¢ng ƱeƤ quy
+ treĆ¢n NN LT Pascal :
Function S(n : integer ) : integer ;
var k ,tg : integer ;
Begin
k := 1 ; tg := 1 ;
while ( k < n ) do begin
k := k + 1 ;
if odd (k) then tg := tg + (2 * k - 1 )
else tg := tg - (2 * k - 1 ) ;
end ;
S := tg ;
end ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 36 -
+ Trong NN LT C++
int S ( int n )
{ int k = 1 , tg = 1 ;
while ( k < n ) { k ++ ;
if (k%2) tg + = 2 * k - 1 ;
else tg - = 2 * k + 1 ;
}
return ( tg ) ;
}
b) CaĆ¹c thuĆ» tuĆÆc ƱeƤ qui daĆÆng ƱeƤ qui ƱuoĆ¢i.
XeĆ¹t thuĆ» tuĆÆc P daĆÆng :
P(X) ā‰” if B(X) then D(X)
else { A(X) ;
P(f(X)) ;
}
Trong ƱoĆ¹ : X laĆø taƤp bieĆ”n ( moƤt hoaĆ«c moƤt boƤ nhieĆ u bieĆ”n ).
P(X) laĆø thuĆ» tuĆÆc ƱeƤ quy phuĆÆ thuoƤc X
A(X) ; D(X) laĆø caĆ¹c nhoĆ¹m thao taĆ¹c (leƤnh ) khoĆ¢ng ƱeƤ quy
f(X) laĆø haĆøm bieĆ”n ƱoĆ„i X
XeĆ¹t quĆ¹a trƬnh thi haĆønh P(X) :
goĆÆi Po laĆø laĆ n goĆÆi P thĆ¶Ć¹ 0 (ƱaĆ u tieĆ¢n ) P(X)
P1 laĆø laĆ n goĆÆi P thĆ¶Ć¹ 1 (laĆ n 2) P(f(X))
Pi laĆø laĆ n goĆÆi P thĆ¶Ć¹ i ( laĆ n i + 1) P(f(f(...f(X)...)
( P(fi(X)) hĆ“ĆÆp i laĆ n haĆøm f )
Trong laĆ n goĆÆi Pi neĆ”u B(fi(X)) khoĆ¢ng ƱuĆ¹ng (false) thƬ thi haĆønh leƤnh A vaĆø goĆÆi Pi+1 ;
neĆ”u B(fi(X)) ƱuĆ¹ng (true) thƬ thi haĆønh leƤnh D vaĆø keĆ”t thuĆ¹c quĆ¹a trƬnh goĆÆi .
GiaĆ» sƶƻ P ƱƶƓĆÆc goĆÆi ƱuĆ¹ng n +1 laĆ n . Khi ƱoĆ¹ Ć“Ć» trong laĆ n goĆÆi cuoĆ”i cuĆøng (thĆ¶Ć¹ n ) Pn thƬ
B(fn(X)) ƱuĆ¹ng , leƤnh D ƱƶƓĆÆc thi haĆønh vaĆø chaĆ”m dĆ¶Ć¹t thao taĆ¹c goĆÆi thuĆ» tuĆÆc P .
SĆ“ ƱoĆ  khoĆ”i quaĆ¹ trƬnh thƶĆÆc hieƤn leƤnh goĆÆi thuĆ» tuĆÆc P(X) coĆ¹ daĆÆng sau :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 37 -
P(X)
True
False
B(X)
A(X) ;
X : = f(X)
END
D(X)
TƶƓng Ć¶Ć¹ng vĆ“Ć¹i voĆøng laĆ«p sau :
While ( not B(X) ) do begin
A(X) ;
X := f(X) ;
end ;
D(X) ;
VĆ­ duĆÆ 1 :
ƑeĆ„ ƱoĆ„i 1 soĆ” nguyeĆ¢n khoĆ¢ng aĆ¢m y Ć“Ć» cĆ“ soĆ” 10 sang daĆÆng cĆ“ soĆ” k ( 2 <= k <= 9 ) vĆ“Ć¹i
vieƤc duĆøng maĆ»ng A ( A : array[1 . . size ] of 0..k -1 , size laĆø moƤt haĆØng ƱƶƓĆÆc khai baĆ¹o
trĆ¶Ć“Ć¹c ) ƱeĆ„ chĆ¶Ć¹a caĆ¹c kyĆ¹ soĆ” trong heƤ k phaĆ¢n ( vĆ“Ć¹i quy Ć¶Ć“Ć¹c kyĆ¹ soĆ” coĆ¹ yĆ¹ nghĆ³a thaĆ”p ƱƶƓĆÆc
chĆ¶Ć¹a Ć“Ć» chƦ soĆ” cao ) khi ƱoĆ¹ thuĆ» tuĆÆc ƱeƤ quy Convert(x,m) ƱeĆ„ taĆÆo daƵy gĆ­a trĆ² : A[0] ,
A[1] , . . . , A[m] nhƶ sau (haƵy tƶĆÆ giaĆ»i thĆ­ch ) :
Convert(n,m) ā‰” if n <> 0 then Begin
A[m] := n mod k ;
Convert(n div k , m -1) ;
End ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 38 -
LeƤnh goĆÆi Convert(y,n) duĆøng ƱeĆ„ ƱoĆ„i soĆ” nguyeĆ¢n y trong cĆ“ soĆ” 10 sang cĆ“ soĆ” k lƶu
daƵy
kyĆ¹ soĆ” trong maĆ»ng A ;
Trong vĆ­ duĆÆ naĆøy ta coĆ¹ :
X laĆø ( n, m ) ;
B(X) laĆø bieĆ„u thĆ¶Ć¹c boolean not( n <> 0 )
A(X) laĆø leƤnh gaĆ¹n A[m] := n mod k ;
f(X) laĆø haĆøm f(n,m ) = ( n div k , m - 1 ) ;
D(X) laĆø leƤnh roĆ£ng
Ƒoan leƤnh laĆ«p tƶƓng Ć¶Ć¹ng vĆ“Ć¹i thuĆ» tuĆÆc Convert(x,m) laĆø :
While (n <> 0) then begin
A[m] := n mod k ; { A(X) }
n := n div k ; { X := f(X) }
m := m - 1 ;
end ;
VĆ­ duĆÆ 2 :
TƬm USCLN cuĆ»a 2 soĆ” nguyeĆ¢n dƶĆÆa vaĆøo thuaƤt toaĆ¹n Euclide .
- GiaĆ»i thuaƤt ƱeƤ quy (dĆ¶Ć“Ć¹i daĆÆng thuĆ» tuĆÆc ) tƬm USCLN(m,n) baĆØng thuaƤt toaĆ¹n Euclide :
USCLN(m , n , var us) ā‰” if ( n = 0 ) then us := m
else USCLN(n , m mod n , us ) ;
- Trong trƶƓĆøng hĆ“ĆÆp naĆøy thƬ :
X laĆø ( m , n , us )
P(X) laĆø USCLN(m ,n ,us)
B(X) laĆø n = 0
D(X) laĆø leƤnh gaĆ¹n us := m
A(X) laĆø leƤnh roĆ£ng
f(X ) laĆø f(m,n,us) = ( n , m mod n ,us )
- ƑoaĆÆn leƤnh laĆ«p tƶƓng Ć¶Ć¹ng laĆø :
While (n <> 0 ) do begin
sd := m mod n ;
m := n ;
n := sd ;
end ;
us := m ;
- ThuĆ» tuĆÆc khoĆ¢ng ƱeƤ quy tƶƓng Ć¶Ć¹ng trong Pascal .
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 39 -
Procedure USCLN(m , n : integer ; var us : integer ) ;
var sd : integer ;
begin
while ( n <> 0 ) do begin
sd := m mod n ;
m := n ;
n := sd ;
end ;
us := m ;
end ;
- HaĆøm con khoĆ¢ng ƱeƤ quy tƶƓng Ć¶Ć¹ng trong C++
void USCLN(int m , int n , int& us )
{ while(n != 0 ) { int sd = m % n ;
m = n ;
n = sd ;
}
us = m ;
}
c) CaĆ¹c haĆøm ƱeƤ qui daĆÆng ƱeƤ qui ƱuoĆ¢i (tail-recusive).
XeĆ¹t haĆøm ƱeƤ qui daĆÆng :
f(g(X)) khi C (X) ƱuĆ¹ng
f ( X ) =
a (X ) khi C (X) sai
TĆ¶Ć¹c laĆø :
f ( X ) ā‰” if( C(X) ) then return( f(g(X))
else return( a(x))
TĆ­nh f(Xo ) .
Ta coĆ¹ :
f(Xo ) = f(g(Xo )) vĆ“Ć­ C(Xo ) ƱuĆ¹ng .
= f(g(g(Xo ))) vĆ“Ć¹i C(g(Xo )) ƱuĆ¹ng .
= ...
= f(gk
(Xo )) vĆ“Ć¹i C(gk-1
(Xo )) ƱuĆ¹ng .
= a(gk
(Xo )) vĆ“Ć¹i C(gk
(Xo )) sai.
( gk
(xo) = g(g (g (xo))))) )
ƑaĆ«t : Uo = Xo = go
(Xo )
Ui = gi
(Xo ) = g(gi-1
(Xo )) = g(Ui-1 ) vĆ“Ć¹i i >= 1
Ta coĆ¹ quan heƤ sau :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 40 -
Uo = Xo
Ui = g(Ui-1 ) i = 1 ... k . VĆ“Ć¹i k laĆø soĆ” nhoĆ» nhaĆ”t maĆø C(Uk ) sai .
LuĆ¹c ƱoĆ¹ : f(Xo ) = a(Uk )
VaƤy ƱoaĆÆn chƶƓng trƬnh tĆ­nh f = f(Xo) laĆø :
U := Xo ;
while C(U) do U := g(U) ;
f := a(U) ;
VĆ­ duĆÆ :
VĆ“Ć¹i m , n > = 0 ta coĆ¹ haĆøm ƱeƤ quy tĆ­nh USCLN(m,n) laĆø :
USCLN(m ,n ) ā‰” if (m <> 0 ) then return(USCLN ( abs(m - n) , min(m , n) ) ;
else return n ;
Trong trƶƓĆøng hĆ“ĆÆp naĆøy :
X laĆø (m ,n ) ;
C (X) = C(m ,n) laĆø m <> 0 ;
g(X) = g(m ,n ) = (abs(m -n ) , min (m ,n ) ) ;
a(x) = a(m ,n ) = n ;
- ƑoaĆÆn chƶƓng trƬnh tĆ­nh USCLN(a ,b) laĆø :
m := a ; n := b ;
while ( m <> 0 ) do begin
t1 := m ;
t2 := n ;
m := abs(t1 - t2 ) ;
n := min(t1,t2 ) ;
end ;
USCLN := n ;
- HaĆøm khoĆ¢ng ƱeƤ qui tƶƓng Ć¶Ć¹ng trong Pascal.
Function USCLN(m , n : integer ) : integer ;
var t1 , t2 : integer ;
begin
while (n <> 0 ) do begin t1 := m ; t2 := n ;
m := abs(t1 - t2 ) ;
if(t1 < t2 ) then n := t1
else n := t2 ;
end ;
USCLN := m ;
- DaĆÆng haĆøm tƶƓng Ć¶Ć¹ng trong C++
int USCLN(int m , int n)
{ while( n != 0) { int t1 = m ; int t2 = n ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 41 -
m = abs(t1-t2) ;
if(t1<t2) n = t1 ; else n = t2 ;
}
return(m) ;
}
2. Khƶƻ ƱeƤ quy haĆøm ƱeƤ quy arsac
a) DaĆÆng haĆøm ƱeƤ qui ARSAC.
a1) DaĆÆng toaĆ¹n hoĆÆc :
DS(A(CS(X) ) , FS(CS(X) , X ) ) ) khi C(X) ƱuĆ¹ng
A(X) =
BS(X) khi C(X) sai
a2) DaĆÆng maƵ giaĆ» :
A(X ) ā‰” if C(X) then return ( DS (A(CS(X)) ,FS(CS(X),X) )
else return (BS(X ) )
VĆ“Ć¹i : BS , CS , DS , FS laĆø caĆ¹c giaĆ»i thuaƤt khoĆ¢ng ƱeƤ qui .
TrƶƓĆøng hĆ“ĆÆp thƶƓĆøng gaĆ«p laĆø : BS(X) , CS(Y) , DS(U,V) , FS(U,V) laĆø caĆ¹c thao taĆ¹c
ƱƓn giaĆ»n , khoĆ¢ng coĆ¹ leƤnh goĆÆi haĆøm con . X , Y ,U , V laĆø bieĆ”n ƱƓn trĆ² hoaĆ«c bieĆ”n veĆ¹c tĆ“
.
ƑaĆ¢y laĆø daĆÆng toĆ„ng quaĆ¹t cuĆ»a haĆøm ƱeƤ quy chƦ goĆÆi ƱeĆ”n chĆ­nh noĆ¹ moƤt laĆ n .
b) SĆ“ ƱoĆ  toĆ„ng quaĆ¹t tĆ­nh gĆ­a trĆ² A(X) :
GoĆÆi Uo = X laĆø gĆ­a trĆ² ƱoĆ”i soĆ” caĆ n tĆ­nh cuĆ»a haĆøm A . VieƤc tĆ­nh A(Uo) seƵ phaĆ¹t sinh
leƤnh goĆÆi tĆ­nh A(U1) vĆ“Ć¹i U1 = CS(Uo) ( gƦa sƶƻ C(Uo) true ).
CĆ¶Ć¹ nhƶ vaƤy , khi maĆø C(Ui ) coĆøn ƱuĆ¹ng thƬ vieƤc tĆ­nh A(Ui ) seƵ phaĆ¹t sinh leƤnh tĆ­nh
A(Ui+1) vĆ“Ć¹i Ui+1 = CS(Ui ).
VĆ“Ć¹i giaĆ» thieĆ”t laĆø Uo = X thuoƤc mieĆ n xaĆ¹c Ć±Ć²nh cuĆ»a A , thƬ quaĆ¹ trƬnh laĆ«p laĆÆi caĆ¹c
leƤnh goĆÆi naĆøy phaĆ»i dƶĆøng laĆÆi sau hƶƵu haĆÆn laĆ n goĆÆi . TĆ¶Ć¹c laĆø āˆƒ k thoĆ»a :
C(Uo) = C(U1) = . . = C(Uk-1) = true , C(Uk) = false.
XeĆ¹t 2 daƵy soĆ” :
- DaƵy : { Ui } = { CS(Ui) } ( 2.1)
Uo = X { cho trĆ¶Ć“Ć¹c }
Ui+1 = CS(Ui) i = 0 . . k-1
- DaƵy : { Vi } = { A(Ui) } (2.2)
Vo = A(Uo) = A(Xo) ( gĆ­a trĆ² caĆ n tĆ­nh ).
Vi = A(Ui) = DS(A(CS(Ui ), FS(CS(Ui), Ui ) )
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 42 -
= DS(A(Ui+1),FS(Ui+1,Ui))
= DS(Vi+1,FS(Ui+1,Ui)) vĆ“Ć¹i 0< i < k ( vƬ C(Ui) ƱuĆ¹ng )
Vk = BS(Uk) ( vƬ C(Uk) = false )
DƶĆÆa vaĆøo 2 daƵy soĆ” {Ui } ,{Vi} ( moĆ¢ taĆ» bĆ“Ć»i (2.1) vaĆø (2.2) ) ta tĆ­nh A(X ) theo giaĆ»i thuaƤt
sau :
- TĆ­nh vaĆø ghi nhĆ“Ć¹ caĆ¹c Ui tƶĆø 0 ƱeĆ”n k theo (2.1).
( VĆ“Ć¹i C(Uo) = C(U1) = ...= C(Uk-1) = True , C(Uk) = False )
- Sƶƻ duĆÆng daƵy gĆ­a trĆ² Ui ƱeĆ„ tĆ­nh laĆ n ngƶƓĆÆc Vi tƶĆø k xuoĆ”ng 0 theo (2.2) , Vo chĆ­nh
laĆø gĆ­a trĆ² caĆ n tĆ­nh ( Vo = A(X ) ).
c) GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy tĆ­nh gĆ­a trĆ² haĆøm Arsac baĆØng sƶƻ duĆÆng caĆ”u truĆ¹c
Stack .
ƑeĆ„ thƶĆÆc hieƤn giaĆ»i thuaƤt treĆ¢n thƬ daƵy Ui phaĆ»i ƱƶƓĆÆc tĆ­nh vaĆø lƶu trƶƻ trong moƤt caĆ”u
truĆ¹c dƶƵ lieƤu thĆ­ch hĆ“ĆÆp , ƱeĆ„ khi caĆ n ƱeĆ”n (khi tĆ­nh Vi ) deĆ£ laĆ”y ra sƶƻ duĆÆng . ƑaĆ«c ƱieĆ„m quan
trong cuĆ»a daƵy Ui laĆø thoĆ»a luaƤt LIFO : thĆ¶Ć¹ tƶĆÆ sƶƻ duĆÆng ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ taĆÆo sinh . CaĆ”u
truĆ¹c dƶƵ lieƤu cho pheĆ¹p lƶu trƶƵ thuaƤn lĆ“ĆÆi daƵy phaĆ n tƶƻ thoĆ»a luaƤt LIFO ( vaĆøo sau ra
trĆ¶Ć“Ć¹c - Last In First Out ) laĆø caĆ¢u truĆ¹c Stack .
( TreĆ¢n caĆ”u truĆ¹c Stack 2 thao taĆ¹c cĆ“ baĆ»n ƱaĆ«c trƶng laĆø :
+ Push(S,X) : CheĆøn phaĆ n tƶƻ dƶƵ lieƤu X vaĆøo Ć±Ć³nh Stack S .
+ Pop(S,X) : LaĆ”y ra khoĆ»i stack S phaĆ n tƶƻ dƶƵ lieƤu Ć“Ć» Ć±Ć³nh vaĆø chĆ¶Ć¹a noĆ¹
vaĆøo bieĆ”n X ).
GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ qui tĆ­nh Vo = A(X) dƶĆÆa treĆ¢n 2 coĆ¢ng thĆ¶Ć¹c (2.1 ) , (2. 2 ) vaĆø sƶƻ
duĆÆng Stack S laĆø :
+ BĆ¶Ć“Ć¹c 1 : tĆ­nh Ui baĆ©t ƱaĆ u tƶĆø Uo theo (2.1) lƶu vaĆøo Stack S
CreateStack(S) ; ( taĆÆo stack roĆ£ng S )
k := 0 ;
U := X ; ( Uo = X )
push(S,U) ; ( cheĆøn UO vaĆøo Ć±Ć³nh stack S )
while C(U) do begin
k := k+1 ;
U := CS(U) ; ( Uk+1 = CS(Uk))
push (S,U) ; ( cheĆøn Uk+1 vaĆøo Ć±Ć³nh Stack S )
end ;
+ BĆ¶Ć“Ć¹c 2 : LaĆ”y dƶƵ lieƤu trong Stack S tĆ­nh Vi theo (2. 2)
pop(S,U) ; ( U = Uk )
V := BS(U) ; ( C(Uk) sai ; V=Vk = BS (Uk))
for i := k -1 downto 0 do
begin
Y := U ; ( Y = Ui+1)
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 43 -
pop(S,U) ; ( U = Ui )
V := DS(V,FS(Y,U)) ; ( C(Ui) ƱuĆ¹ng ; Vi = DS(Vi+1,FS(Ui+1,Ui)) )
end ;
{ V = A(Xo) }
Hoaƫc :
+ BĆ¶Ć“Ć¹c 1 : tĆ­nh Ui baĆ©t ƱaĆ u tƶĆø Uo theo (2.1) lƶu vaĆøo Stack S
CreateStack(S) ; ( taĆÆo stack roĆ£ng S )
U := Xo ; ( Uo = Xo )
push(S,U) ; ( cheĆøn UO vaĆøo Ć±Ć³nh stack S )
while C(U) do begin
U := CS(U) ; ( UK+1 = CS(UK))
push (S,U) ; ( cheĆøn Uk+1 vaĆøo Ć±Ć³nh Stack S )
end ;
+ BĆ¶Ć“Ć¹c 2 : LaĆ”y dƶƵ lieƤu trong Stack S tĆ­nh Vi theo (2. 2)
pop(S,U) ; ( U = Uk )
V := BS(U) ; ( C(Uk) sai ; V=Vk = BS (Uk))
While(not emptystack(S)) do
begin
Y := U ; ( Y = Ui+1)
pop(S,U) ; ( U = Ui )
V := DS(V,FS(Y,U)) ; ( C(Ui) ƱuĆ¹ng ; Vi =
DS(Vi+1,FS(Ui+1,Ui)) )
end ;
{ V = A(Xo) }
CĆ“ cheĆ” lƶu trƶƻ daƵy dƶƵ lieƤu LIFO baĆØng Stack laĆø moƤt ƱaĆ«c trƶng cuĆ»a quaĆ¹ trƬnh xƶƻ lyĆ¹
giaĆ»i thuaƤt ƱeƤ quy ƱieĆ u caĆ n quan taĆ¢m laĆø caĆ”u truĆ¹c stack thƶƓĆøng chieĆ”m nhieĆ u boƤ nhĆ“Ć¹ . VƬ
vaƤy ngƶƓĆøi ta luoĆ¢n tƬm caĆ¹ch traĆ¹nh duĆøng noĆ¹ khi coĆøn traĆ¹nh ƱƶƓĆÆc .
d) MoƤt soĆ” haĆøm Arsac ƱaĆ«c bieƤt maĆø vieƤc khƶƻ ƱeƤ qui giaĆ»i thuaƤt tĆ­nh gĆ­a trĆ²
haĆøm coĆ¹ theĆ„ khoĆ¢ng duĆøng Stack .
d1) TrƶƓĆøng hĆ“ĆÆp thuĆ» tuĆÆc CS laĆø song aĆ¹nh .
TrƶƓĆøng hĆ“ĆÆp CS laĆø song aĆ¹nh tƶĆø mieĆ n D leĆ¢n mieĆ n D thƬ haĆøm CS coĆ¹ haĆøm ngƶƓĆÆc
CS-1
. GoĆÆi haĆøm ngƶƓĆÆc cuĆ»a haĆøm CS laĆø haĆøm CSM1 .
Ta coĆ¹ : CSM1(CS(X)) = CS-1
(CS(X)) = X vĆ“Ć¹i āˆ€ X āˆˆ D .
NeĆ¢n : CSM1(Ui+1) = CS-1
(CS(Ui)) = Ui vĆ“Ć¹i i = k-1, . . ,1,0
Khi ƱoĆ¹ ta khoĆ¢ng caĆ n lƶu giƶƵ caĆ¹c giaĆ¹ trĆ² trung gian cuĆ»a daƵy { Ui } maĆø chƦ caĆ n
xuaĆ”t phaĆ¹t tƶĆø Uk duĆøng haĆøm CSM1 ƱeĆ„ khoĆ¢i phuĆÆc laĆÆi caĆ¹c gĆ­a trĆ² Ui voĆ¹i i<k .
GiaĆ»i thuaƤt tĆ­nh A(X ) seƵ trĆ“Ć» thaĆønh :
+ BĆ¶Ć“Ć¹c 1 : DƶĆÆa vaĆøo (2.1) tĆ­nh Uk
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 44 -
U := X ; ( Uo = X )
k := 0 ;
while C(U) do begin
k := k+1 ;
U := CS(U) ; ( UK+1 = CS(UK))
end ;
+ BĆ¶Ć“Ć¹c 2 : TĆ­nh Vk , Vk-1, .. V1, Vo dƶĆÆa vaĆøo Uk ,(2.2) vaĆø CSM1
V := BS(U) ; ( V=Vk = BS (Uk) )
for i := k -1 downto 0 do begin
Y := U ; ( Y = Ui+1 )
U := CSM1(U) ; (Ui = CSM1(Ui+1) )
V := DS(V,FS(Y,U)) ;
( Vi = DS(Vi+1,FS(Ui+1,Ui) )
end ;
{ V = Vo = A(X )}
d2) TrƶƓĆøng hĆ“ĆÆp thuĆ» tuĆÆc DS coĆ¹ tĆ­nh hoaĆ¹n vĆ² .
XeĆ¹t coĆ¢ng thĆ¶Ć¹c tĆ­nh :
Vi = DS(Vi+1,FS(Ui+1,Ui)) vĆ“Ć¹i moĆÆi i<k
ƑaĆ«t : Uā€™i = FS(Ui+1,Ui )
DS(Vi+1,Uā€™i) = Vi+1 T Uā€™i
Ta coĆ¹ :
Vo = DS(V1, FS(U1,Uo) = DS(V1,Uā€™o) = V1 T Uā€™0
V1 = DS(V2, FS(U2,U1) = DS(V2,Uā€™1) = V2 T Uā€™1
V2 = DS(V3, FS(U3,U2) = DS(V3,Uā€™2) = V3 T Uā€™2
..............................................................................
..............................................................................
Vi = DS(Vi+1, FS(Ui+1,Ui) = DS(Vi+1,Uā€™i) = Vi+1 T Uā€™i ( 3 - 1 )
..............................................................................
..............................................................................
Vk-1 = DS(Vk, FS(Uk,Uk-1) = DS(Vk,Uā€™k-1) = Vk T Uā€™k-1
Vk = BS(Uk)
Khi DS coĆ¹ tĆ­nh hoaĆ¹n vĆ² tĆ¶Ć¹c : DS(DS(x,y),z) = DS(DS(x,z),y)
( VieĆ”t treĆ¢n kyĆ¹ hieƤu T : (x T y) T z = (x T z) T y
ThƶĆÆc hieƤn theĆ” laĆ n lƶƓĆÆt V1 roĆ i V2 ... trong coĆ¢ng thĆ¶Ć¹c Vo.
Ta coĆ¹ :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 45 -
Vo = V1 T Uā€™0 = ( V2 T Uā€™1) T Uo = ( V2 T Uā€™0 ) T Uā€™1
= ( ( V3 T Uā€™2) T Uā€™o) T Uā€™1 = ((V3 T Uā€™2) T Uā€™o ) T Uā€™1
= ( (V3 T Uā€™o) T Uā€™2 ) T Uā€™1
= ( (V3 T Uā€™o) T Uā€™1 ) T Uā€™2
.......................................................................................................
.......................................................................................................
V0 = ( .... ((( Vk T Uā€™o) T Uā€™1) T Uā€™2 ) T ........T Uā€™k-2) T Uā€™k-1 (3 - 2 )
(3 - 2) laĆø moƤt daƵy lieĆ¢n tieĆ”p ( moƤt toĆ„ng ) k pheĆ¹p toaĆ¹n T maĆø ta ƱaƵ bieĆ”t giaĆ»i thuaƤt
tĆ­nh. ThƶĆÆc vaƤy :
ThieƔt laƤp daƵy Wi nhƶ sau :
W0 = Vk
Wi = Wi-1 T Uā€™i-1 vĆ“Ć¹i i = 1..k
TĆ¶Ć¹c laĆø : Wo = Vk = BS(Uk ) (3 - 3 )
Wi = Wi-1 T Uā€™i-1 = DS(Wi-1,FS(Ui,Ui-1)) i=1..k
Wk chĆ­nh laĆø gĆ­a trĆ² Vo caĆ n tĆ­nh .
Nhƶ vaƤy giaĆ»i thuaƤt tĆ­nh Wk ( Vo = A(X ) ) goĆ m 2 bĆ¶Ć“Ć¹c :
BĆ¶Ć“Ć¹c 1: XaĆ¹c Ć±Ć²nh k vaĆø Uk theo coĆ¢ng thĆ¶Ć¹c ( 1 - 1 )
BĆ¶Ć“Ć¹c 2: TĆ­nh daƵy Wi , trong luĆ¹c tĆ­nh thƬ phaĆ»i tĆ­nh laĆÆi daƵy Ui ,theo ( 3 - 3)
A(X ) = Vo = Wk .
GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ qui tƶƓng Ć¶Ć¹ng dƶƓĆÆc xem nhƶ baĆøi taƤp .
3. Khƶƻ ƱeƤ quy moƤt soĆ” daĆÆng thuĆ» tuĆÆc ƱeƤ quy thƶƓĆøng gaĆ«p.
a) DaĆ£n nhaƤp.
ƑeĆ„ thƶĆÆc hieƤn moƤt chƶƓng trƬnh con ƱeƤ quy thƬ heƤ thoĆ”ng phaĆ»i toĆ„ chĆ¶Ć¹c vuĆøng lƶu trį»Æ
thoĆ»a quy taĆ©c LIFO (vuĆøng Stack). VƬ vaƤy chƦ nhƶƵng ngoĆ¢n ngƶƵ laƤp trƬnh coĆ¹ khaĆ» naĆŖng taĆÆo
vuĆøng nhĆ“Ć¹ stack mĆ“Ć¹i cho pheĆ¹p toĆ„ chĆ¶Ć¹c caĆ¹c chƶƓng trƬnh con ƱeƤ quy. ThƶĆÆc hieƤn moƤt
chƶƓng trƬnh con ƱeƤ quy theo caĆ¹ch maĆ«c Ć±Ć²nh thƶƓĆøng toĆ”n boƤ nhĆ“Ć¹ vƬ caĆ¹ch toĆ„ chĆ¶Ć¹c Stack
moƤt caĆ¹ch maĆ«c Ć±Ć²nh thĆ­ch hĆ“ĆÆp cho moĆÆi trƶƓĆøng hĆ“ĆÆp thƶƓĆøng laĆø khoĆ¢ng toĆ”i ƶu trong tƶĆøng
trƶƓĆøng hĆ“ĆÆp cuĆÆ theĆ„. VƬ vaƤy seĆ» raĆ”t coĆ¹ Ć­ch khi ngƶƓĆøi laƤp trƬnh chuĆ» ƱoƤĆÆng taĆÆo ra caĆ”u truĆ¹c dƶƵ
lieƤu stack ƱaĆ«c duĆÆng cho tƶĆøng chƶƓng trƬnh con ƱeƤ quy cuĆÆ theĆ„ .
PhaĆ n tieĆ p theo seĆ» trƬnh baĆøy vieƤc khƶƻ ƱeƤ quy moƤt soĆ” daĆÆng thuĆ» tuĆÆc ƱeƤ quy theo hĆ¶Ć“Ć¹ng
thay giaĆ»i thuaƤt ƱeƤ quy baĆØng caĆ¹c voĆøng laĆ«p vaĆø moƤt caĆ”u truĆ¹c dƶƵ lieƤu kieĆ„u stack thĆ­ch hĆ“ĆÆp .
b) ThuĆ» tuĆÆc ƱeƤ qui chi coĆ¹ moƤt leƤnh goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p .
MoĆ¢ hƬnh toĆ„ng quaĆ¹t cuĆ»a thuĆ» tuĆÆc ƱeƤ quy chƦ coĆ¹ moƤt leƤnh goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p laĆø :
P(X) ā‰” if C(X) then D(X)
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 46 -
else begin
A(X) ; P(f(X)) ; B(X) ;
end ;
VĆ“Ć¹i :
X laĆø moƤt bieĆ¹n ƱƓn hoaĆ«c bieĆ”n veĆ¹c tĆ“.
C(X) laĆø moƤt bieĆ„u thĆ¶Ć¹c boolean cuĆ»a X .
A(X) , B(X) , D(X) laĆø caĆ¹c nhoĆ¹m leƤnh khoĆ¢ng ƱeƤ quy ( khoĆ¢ng chĆ¶Ć¹a leƤnh goĆÆi ƱeĆ”n
P ).
f(X) laĆø haĆøm cuĆ»a X .
TieĆ”n trƬnh thƶĆÆc hieƤn thuĆ» tuĆÆc P(X) seĆ» laĆø :
+ NeĆ”u C(X) ƱuĆ¹ng thƬ thƶĆÆc hieƤn D(X) .
+ CoĆøn khoĆ¢ng ( C(X) sai ) thƬ thƶĆÆc hieƤn A(X) ; goĆÆi P(f(X)) ; thƶĆÆc hieƤn B(X) . (
B(X) chƦ ƱƶƓĆÆc thƶĆÆc hieƤn khi P(f(X)) thƶĆÆc hieƤn xong ) .
MoĆ£i laĆ n thaĆønh phaĆ n ƱeƤ quy P(Y) ƱƶƓĆÆc goĆÆi thƬ thoĆ¢ng tin giaĆ»i thuaƤt B(Y) laĆÆi
ƱƶƓĆÆc sinh ra (nhƶng chƶa thƶĆÆc hieƤn ) .
GƦa sƶƻ quĆ¹a trƬnh ƱeƤ quy keĆ”t thuĆ¹c sau k laĆ n goĆÆi ƱeƤ quy thƬ ta phaĆ»i thƶĆÆc hieƤn
moƤt daƵy k thao taĆ¹c B theo thĆ¶Ć¹ tƶĆÆ : B(fk-1
(X)) , B(fk-2
(X)) , . . . ,B(f(f(X)))
,B(f(X)),B(X).
ƑeĆ„ thƶĆÆc hieƤn daƵy thao taĆ¹c { B(fi
(X)) } theo thĆ¶Ć¹ tƶĆÆ ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ phaĆ¹t sinh ta caĆ n
daƵy dƶƵ lieƤu {fi
(X) } truy xuaĆ”t theo nguyeĆ¢n taĆ©c LIFO. Ta seĆ» duĆøng moƤt Stack ƱeĆ„ lƶu trƶƻ
daƵy { fi
(X) } ā‰” { X , f(X) , f(f(X)) , . . . , fi
(X) , . . . , fk-1
(X) }
TrƬnh tƶĆÆ thƶĆÆc hieƤn P(X) ƱƶƓĆÆc dieĆ£n taĆ» baĆØng moĆ¢ hƬnh sau :
P(X)
C(X) = False A(X) ; Push(S,X); U:=f(X) ; P(U) ; POP(S,U) ; B(U)
( U = X )
C(U) = False A(U) ; Push(S,U); U :=f(U)); P(U) ; POP(S,U) ; B(U)
( U = f(X))
C(U) = False A(U) ; Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U)
------------------------------------------------------------------------------------------------
C(U) = False A(U) ;------> Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U)
( U=fk-1
(X) )
C(U) = True D(U )
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 47 -
GiaĆ»i thuaƤt thƶĆÆc hieƤn P(X) vĆ“Ć¹i vieƤc sƶƻ duĆÆng Stack coĆ¹ daĆÆng :
P(X) ā‰” { Creat_Stack (S) ; ( taĆÆo stack S )
While(not(C(X)) do begin A(X) ;
Push(S,X) ; ( caĆ”t gĆ­a trĆ² X vaĆøo stack S )
X := f(X) ;
end ;
D(X) ;
While(not(EmptyS(S))) do begin
POP(S,X) ; ( laĆ”y dƶƵ lieƤu tƶĆø S )
B(X) ;
end ;
}
VĆ­ duĆÆ :
ThuĆ» tuĆÆc ƱeƤ quy chuyeĆ„n bieĆ„u dieĆ£n soĆ” tƶĆø cĆ“ soĆ” thaƤp phaĆ¢n sang nhĆ² phaĆ¢n coĆ¹ daĆÆng :
Binary(m) ā‰” if ( m > 0 ) then begin
Binary( m div 2 ) ;
write( m mod 2 ) ;
end;
Trong trƶƓĆøng hĆ“ĆÆp naĆøy :
X laĆø m .
P(X) laĆø Binary(m) .
A(X) ; D(X) laĆø leƤnh roĆ£ng .
B(X) laĆø leƤnh Write(m mod 2 ) ;
C(X) laĆø ( m <= 0 ) .
f(X) = f(m) = m div 2 .
GiaĆ¹i thuaƤt thƶĆÆc hieƤn Binary(m) khoĆ¢ng ƱeƤ quy laĆø :
Binary (m ) ā‰” { Creat_Stack (S) ;
While ( m > 0 ) do begin
sdu := m mod 2 ;
Push(S,sdu) ;
m := m div 2 ;
end;
While( not(EmptyS(S)) do begin
POP(S,sdu) ;
Write(sdu) ;
end;
}
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 48 -
c) NhieĆ u leƤnh goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p.
c1) ThuĆ» tuĆÆc ƱeƤ quy vĆ“Ć¹i 2 laĆ n goĆÆi trƶĆÆc tieĆ”p
ThuĆ» tuĆÆc ƱeƤ quy 2 laĆ n goĆÆi trƶĆÆc tieĆ”p coĆ¹ daĆÆng :
P(X) ā‰” if C(X) then D(X)
else begin
A(X) ; P(f(X)) ;
B(X) ; P(g(X)) ;
end ;
QuĆ¹a trƬnh thƶĆÆc hieƤn thuĆ» tuĆÆc P(X) seĆ» laĆø :
- NeĆ”u C(X) ƱuĆ¹ng thƬ thƶĆÆc hieƤn D(X) .
- NeĆ”u C(X) sai thƬ thƶĆÆc hieƤn A(X) ; goĆÆi P(f(X)) ; thƶĆÆc hieƤn B(X) ; goĆÆi P(g(X)) , khi
goĆÆi P(g(X)) thƬ laĆÆi phaĆ¹t sinh leƤnh A(g(X)) nhƶ vaƤy ngoaĆøi vieƤc phaĆ»i lƶu vaĆøo stack caĆ¹c
gĆ­a trĆ² fi
(X) ta con phaĆ»i lƶu vaĆøo stack caĆ¹c gĆ­a trĆ² gi
(X) tƶƓng Ć¶Ć¹ng . Khi ta laĆ”y dƶƵ lieƤu tƶĆø
stack ƱeĆ„ thƶĆÆc hieƤn leƤnh B(U) maĆø chƶa gaĆ«p ƱieĆ u kieƤn keĆ”t thuĆ¹c thƬ ta thƶĆÆc hieƤn P(g(U))
vaĆø laĆÆi phaĆ»i lƶu gĆ­a trĆ² g(U) vaĆøo stack ,... ƑieĆ u kieƤn dƶĆøng laĆø khi truy xuaĆ”t tĆ“Ć¹i phaĆ n tƶƻ
lƶu ƱaĆ u tieĆ¢n trong stack .
Nhƶ vaƤy laĆø ngoaĆøi dƶƵ lieƤu X , con phaĆ»i lƶu vaĆøo ngaĆŖn xeĆ”p theĆ¢m thĆ¶Ć¹ tƶĆÆ laĆ n goĆÆi ( cuĆÆm
goĆÆi )
ThuaƤt toaĆ¹n khƶƻ ƱeƤ quy tƶƓng Ć¶Ć¹ng vĆ“Ć¹i thuĆ» tuĆÆc ƱeƤ quy P(X) laĆø :
{ Creat_Stact (S) :
Push (S, (X,1)) ;
Repeat
While ( not C(X) ) do begin
A(X) ;
Push (S, (X,2)) ;
X := f(X) ;
end ;
D(X) ;
POP (S, (X,k)) ;
if ( k <> 1) then begin
B(X) ;
X := g(X) ;
end ;
until ( k = 1 ) ;
}
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 49 -
VĆ­ duĆÆ : Khƶƻ ƱeƤ quy thuĆ» tuĆÆc ThaĆ¹p HaĆø NoƤi .
+ DaĆÆng ƱeƤ quy cuĆ»a thuĆ» tuĆÆc ThaĆ¹p HaĆø NoƤi laĆø :
THN(n , X , Y, Z ) ā‰” if( n > 0 ) then begin
THN ( n - 1 , X , Z , Y ) ;
Move ( X , Z ) ;
THN ( n - 1 , Y , X , Z ) ;
end ;
VĆ“Ć¹i n laĆø soĆ” Ć±Ć³a , X laĆø coƤt ƱaĆ u , Z laĆø coƤt cuoĆ”i , Y laĆø coƤt giƶƵa ,Move(X,Z) laĆø thao taĆ¹c
chuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X tĆ“Ć¹i coƤt Z .
Trong trƶƓĆøng hĆ“ĆÆp naĆøy :
BieĆ”n X laĆø boƤ ( n , X , Y , Z ) .
C(X) laĆø bieĆ„u thĆ¶Ć¹c boolean ( n < = 0 ) .
D(X) , A(X) laĆø thao taĆ¹c roĆ£ng .
B(X) = B(n,X,Y,Z) laĆø thao taĆ¹c Move(X,Z) ;
f(X) = f(n ,X ,Y ,Z) = (n - 1 , X , Z , Y) .
g(X) = g(n ,X , Y, Z ) = (n - 1 , Y ,X , Z ) .
GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy tƶƓng ƱƶƓng laĆø :
{ Creat_Stack (S) ;
Push (S ,(n,X,Y,Z,1)) ;
Repeat
While ( n > 0 ) do begin
Push (S ,(n,X,Y,Z,2)) ;
n := n - 1 ;
Swap (Y,Z ) ; (* Swap(a,b) laĆø thuĆ» tuĆÆc hoaĆ¹n
end ; ƱoƄi noƤi dung 2 bieƔn a ,b *)
POP (S,(n,X,Y,Z,k)) ;
if ( k <> 1 ) then begin
Move (X ,Z ) ;
n := n - 1 ;
Swap (X ,Y ) ;
end ;
until ( k = 1 ) ;
}
c2) TrƶƓĆøng hĆ“ĆÆp n laĆ n goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p .
ThuĆ» tuĆÆc ƱeƤ quy trong trƶƓĆøng hĆ“ĆÆp naĆøy coĆ¹ daĆÆng :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 50 -
P(X) ā‰” if C(X) then D(X)
else begin
A1(X) ; P(f1(X)) ;
A2(X) ; P(f2(X)) ;
............................
Ai(X) ; P(fi(X)) ;
............................
An(X) ; P(fn(X)) ;
An+1(X) ;
end ;
CuƵng gioĆ”ng nhƶ trong trƶƓĆøng hĆ“ĆÆp (3a) laĆø khi quay trĆ“Ć» laĆÆi sau khi thƶĆÆc hieƤn moƤt laĆ n
ƱeƤ quy, caĆ n bieĆ”t ƱoĆ¹ laĆø leƤnh goĆÆi thuoƤc nhoĆ¹m thĆ¶Ć¹ maĆ”y trong daƵy leƤnh goĆÆi ƱeĆ„ bieĆ”t thao
taĆ¹c caĆ n thƶĆÆc hieƤn tieĆ”p. VƬ vaƤy trong choĆ ng caĆ n giƶƵ theĆ¢m vĆ² trĆ­ nhoĆ¹m leƤnh goĆÆi .
DaĆÆng laĆ«p tƶƓng Ć¶Ć¹ng laĆø :
{ Creat_Stack (S) ;
Push(S,(X,1)) ;
Repeat
While (not C(X) ) do begin
A1(X) ;
Push (S,(X,2)) ;
X := f1(X) ;
end ;
D(X) ;
POP(S,(X,k)) ;
While( k = n+1 ) do begin
An+1 ;
POP(S,(X,k)) ;
end ;
if ( k > 0 ) then begin
Ak(X) ;
Push (S,(X,k+1));
X := f k (X)
end ;
until (k = 1 ) ;
}
VĆ­ duĆÆ : Khƶƻ ƱeƤ quy cho thuĆ» tuĆÆc hoaĆ¹n vĆ² .
+ ThuĆ» tuĆÆc hoaĆ¹n vĆ² dĆ¶Ć“Ć¹i daĆÆng ƱeƤ quy :
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 51 -
HVI(V ,n) ā‰” if (n = 1 ) then Print ( V )
else for i := n downto 1 do
begin
Swap (V[n],V[i] ) ;
HVI(V ,n - 1) :
end ;
trong trƶƓĆøng hĆ“ĆÆp naĆøy thƬ :
X laĆø boƤ (V ,n ) . (* vector V vaĆø soĆ” nguyeĆ¢n n *)
C(X) laĆø ( n = 1 ) .
D(X) laĆø Print (V) . (* xuaĆ”t vector V *)
Ai(X) laĆø thuĆ» tuĆÆc Swap(V[n] ,V[i] ) ( i = 1 .. n ) .
An+1 laĆø thao taĆ¹c roĆ£ng .
fi(X) = f(V, n ) = ( V, n - 1) .( vĆ“Ć¹i i = 1 . . n )
DaĆÆng laĆ«p cuĆ»a thuĆ» tuĆÆc laĆø :
{ Creat_Stack (S) ;
Push (S,(V ,n ,1)) ;
Repeat
While ( n > 1 ) do begin
Swap(V[n] ,V[1] ;
Push (S ,V , n ,2) ;
n := n -1 ;
end ;
Print (V) ;
POP (S ,(V ,n ,k)) ;
While ( k = n +1 ) do POP(S ,(V ,n ,k) ;
if(k <> 1 ) then begin
Swap(V[n] ,V[k]) ;
Push (S ,(V ,n ,k+1) ;
n := n - 1 ;
end ;
until(k = 1 ) ;
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 52 -
PHAƀN II
KIEƅM CHƖƙNG CHƖƔNG TRƌNH
CHƖƔNG IV
CAƙC KHAƙI NIEƄM
I. CAƙC GIAI ƑOAƏN TRONG CUOƄC SOƁNG CUƛA MOƄT PHAƀN MEƀM
VieƤc sƶƻ duĆÆng maĆ¹y tĆ­nh ƱeĆ„ giaĆ»i moƤt baĆøi toaĆ¹n thƶĆÆc teĆ” thƶƓĆøng bao goĆ m nhieĆ u vieƤc.
Trong caĆ¹c coĆ¢ng vieƤc ƱoĆ¹ coĆ¢ng vieƤc maĆø ngƶƓĆøi ta quan taĆ¢m nhaĆ”t laĆø vieƤc xaĆ¢y dƶĆÆng caĆ¹c heƤ
thoĆ”ng phaĆ n meĆ m (caĆ¹c heƤ thoĆ”ng chƶƓng trƬnh giaĆ»i baĆøi toaĆ¹n ).
ƑeĆ„ xaĆ¢y dƶĆÆng moƤt heƤ thoĆ”ng phaĆ n meĆ m , ngƶƓĆøi ta thƶƓĆøng thƶĆÆc hieƤn trƬnh tƶĆÆ caĆ¹c coĆ¢ng
vieƤc sau : ƑaĆ«c taĆ» baĆøi toaĆ¹n, xaĆ¢y dƶĆÆng heƤ thoĆ”ng, sƶƻ duĆÆng vaĆø baĆ»o trƬ.
1) ƑaĆ«c taĆ» baĆøi toaĆ¹n
GoĆ m vieƤc phaĆ¢n tĆ­ch ƱeĆ„ naĆ©m baĆ©t roƵ yeĆ¢u caĆ u cuĆ»a baĆøi toaĆ¹n vaĆø dieĆ£n ƱaĆÆt chĆ­nh xaĆ¹c laĆÆi
baĆøi toaĆ¹n baĆØng ngoĆ¢n ngƶƵ thĆ­ch hĆ“ĆÆp vƶĆøa thĆ­ch Ć¶Ć¹ng vĆ“Ć¹i chuyeĆ¢n ngaĆønh tin hoĆÆc vƶĆøa coĆ¹ tĆ­nh
ƱaĆÆi chuĆ¹ng ( deĆ£ hieĆ„u ƱoĆ”i vĆ“Ć¹i nhieĆ u ngƶƓĆøi).
2) XaĆ¢y dƶĆÆng heƤ thoĆ”ng
Trong bĆ¶Ć“Ć¹c naĆøy seĆ» tuaĆ n tƶĆÆ thƶĆÆc hieƤn caĆ¹c coĆ¢ng vieƤc sau :
- ThieĆ”t keĆ” : XaĆ¢y dƶĆÆng moĆ¢ hƬnh heƤ thoĆ”ng phaĆ n meĆ m caĆ n coĆ¹. Trong bĆ¶Ć“Ć¹c naĆøy,
coĆ¢ng vieƤc chuĆ» yeĆ”u laĆø phaĆ¢n chia heƤ thoĆ”ng thaĆønh caĆ¹c module chĆ¶Ć¹c naĆŖng vaĆø xaĆ¹c Ć±Ć²nh roƵ
chĆ¶Ć¹c naĆŖng cuĆ»a tƶĆøng module cuƵng nhƶ moĆ”i tƶƓng taĆ¹c giƶƵa caĆ¹c module vĆ“Ć¹i nhau. ChĆ¶Ć¹c
naĆŖng cuĆ»a moĆ£i module ƱƶƓĆÆc Ć±Ć²nh roƵ bĆ“Ć»i ƱaĆ«c taĆ» cuĆ»a tƶĆøng module tƶƓng Ć¶Ć¹ng.
- TrieĆ„n khai tƶĆøng module vaĆø thƶƻ nghieƤm :
VieĆ”t chƶƓng trƬnh cho tƶĆøng module (baĆøi toaĆ¹n con) thoĆ»a "ƱuĆ¹ng" ƱaĆ«c taĆ» ƱaƵ ƱaĆ«t ra. TĆ­nh
ƱuĆ¹ng cuĆ»a chƶƓng trĆ­nh ƱƶƓĆÆc quan taĆ¢m baĆØng 2 hĆ¶Ć“Ć¹ng khaĆ¹c nhau :
+ ChĆ¶Ć¹ng minh tĆ­nh ƱuĆ¹ng moƤt caĆ¹ch hƬnh thĆ¶Ć¹c (thƶƓĆøng laĆø moƤt coĆ¢ng vieƤc khoĆ¹
khaĆŖn) .
+ ChaĆÆy thƶƻ chƶƓng trƬnh treĆ¢n nhieĆ u boƤ dƶƵ lieƤu thƶƻ khaĆ¹c nhau moĆ£i boƤ dƶƵ
lieƤu ƱaĆÆi dieƤn cho moƤt lĆ“Ć¹p dƶƵ lieƤu (thƶƓĆøng laĆø moƤt coĆ¢ng vieƤc toĆ”n keĆ¹m ). ƑeĆ„ coĆ¹ tĆ­nh
thuyeĆ”t phuĆÆc cao, ngƶƓĆøi ta caĆ n chaĆÆy thƶƻ treĆ¢n caĆøng nhieĆ u boƤ dƶƵ lieƤu caĆøng toĆ”t. Khi thƶƻ
neĆ”u phaĆ¹t hieƤn sai thƬ phaĆ»i sƶƻa laĆÆi chƶƓng trƬnh coĆøn chƶa phaĆ¹t hieƤn sai thƬ ta con taĆÆm tin
chƶƓng trƬnh ƱuĆ¹ng (chaĆÆy thƶƻ chƦ coĆ¹ taĆ¹c duĆÆng phaĆ¹t hieƤn sai vaĆø taĆŖng loĆøng tin vaĆøo tĆ­nh
ƱuĆ¹ng chĆ¶Ć¹ khoĆ¢ng chĆ¶Ć¹ng minh ƱƶƓĆÆc tĆ­nh ƱuĆ¹ng ).
TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh
Kythuatlaptrinh

More Related Content

What's hot

ToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c gia
ToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c giaToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c gia
ToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c gia
xuyn3
Ā 
GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng   đį»— thį»‹ mĘ”[bookbooming.com]GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng   đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng đį»— thį»‹ mĘ”[bookbooming.com]bookbooming1
Ā 
thuyįŗæt minh đį»“ Ć”n thĆ©p 2
thuyįŗæt minh đį»“ Ć”n thĆ©p 2 thuyįŗæt minh đį»“ Ć”n thĆ©p 2
thuyįŗæt minh đį»“ Ć”n thĆ©p 2
Ho Ngoc Thuan
Ā 
Tailieu.vncty.com cong nghe-che_bien_phan_compost_5949
Tailieu.vncty.com   cong nghe-che_bien_phan_compost_5949Tailieu.vncty.com   cong nghe-che_bien_phan_compost_5949
Tailieu.vncty.com cong nghe-che_bien_phan_compost_5949
Trįŗ§n Đį»©c Anh
Ā 
Giai thuat va lap trinh
Giai thuat va lap trinhGiai thuat va lap trinh
Giai thuat va lap trinhhieusy
Ā 
Luįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAY
Luįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAYLuįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAY
Luįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAY
Dį»‹ch vį»„ viįŗæt bĆ i trį»n gĆ³i ZALO: 0909232620
Ā 
GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0 fpt software solution[bookbooming.com]
GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0   fpt software solution[bookbooming.com]GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0   fpt software solution[bookbooming.com]
GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0 fpt software solution[bookbooming.com]bookbooming1
Ā 
Giao trinh cau truc du lieu va giai thuat
Giao trinh cau truc du lieu va giai thuatGiao trinh cau truc du lieu va giai thuat
Giao trinh cau truc du lieu va giai thuatPham Minh Hai
Ā 
Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]bookbooming1
Ā 
Giao trinh ktmt
Giao trinh ktmtGiao trinh ktmt
Giao trinh ktmtsiu23792
Ā 
Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...
Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...
Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...
VÅ©
Ā 
Baigiang access ttth
Baigiang access ttthBaigiang access ttth
Baigiang access ttth
lam04dt
Ā 
Giao trinh co so du lieu can ban
Giao trinh co so du lieu can banGiao trinh co so du lieu can ban
Giao trinh co so du lieu can ban
Van Pham
Ā 
Bai giang autoCAD smith.n ebooks
Bai giang autoCAD   smith.n ebooksBai giang autoCAD   smith.n ebooks
Bai giang autoCAD smith.n ebooks
Ngananh Saodem
Ā 

What's hot (14)

ToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c gia
ToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c giaToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c gia
ToĆ n bį»™ hĆ³a 12 thi thpt quį»‘c gia
Ā 
GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng   đį»— thį»‹ mĘ”[bookbooming.com]GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng   đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh tin hį»c đįŗ”i cĘ°Ę”ng đį»— thį»‹ mĘ”[bookbooming.com]
Ā 
thuyįŗæt minh đį»“ Ć”n thĆ©p 2
thuyįŗæt minh đį»“ Ć”n thĆ©p 2 thuyįŗæt minh đį»“ Ć”n thĆ©p 2
thuyįŗæt minh đį»“ Ć”n thĆ©p 2
Ā 
Tailieu.vncty.com cong nghe-che_bien_phan_compost_5949
Tailieu.vncty.com   cong nghe-che_bien_phan_compost_5949Tailieu.vncty.com   cong nghe-che_bien_phan_compost_5949
Tailieu.vncty.com cong nghe-che_bien_phan_compost_5949
Ā 
Giai thuat va lap trinh
Giai thuat va lap trinhGiai thuat va lap trinh
Giai thuat va lap trinh
Ā 
Luįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAY
Luįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAYLuįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAY
Luįŗ­n văn: Chung cĘ° An DĘ°Ę”ng VĘ°Ę”ng tįŗ”i tį»‰nh LĆ o Cai, HAY
Ā 
GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0 fpt software solution[bookbooming.com]
GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0   fpt software solution[bookbooming.com]GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0   fpt software solution[bookbooming.com]
GiĆ”o trƬnh đƠo tįŗ”o visual basic 6.0 fpt software solution[bookbooming.com]
Ā 
Giao trinh cau truc du lieu va giai thuat
Giao trinh cau truc du lieu va giai thuatGiao trinh cau truc du lieu va giai thuat
Giao trinh cau truc du lieu va giai thuat
Ā 
Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]
Ā 
Giao trinh ktmt
Giao trinh ktmtGiao trinh ktmt
Giao trinh ktmt
Ā 
Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...
Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...
Tin hį»c hĆ³a cĆ“ng tĆ”c quįŗ£n lĆ½ bĆ”n hĆ ng tįŗ”i cĆ“ng ty cį»• phįŗ§n chĆØ HĆ  ThĆ”i, ThĆ”i N...
Ā 
Baigiang access ttth
Baigiang access ttthBaigiang access ttth
Baigiang access ttth
Ā 
Giao trinh co so du lieu can ban
Giao trinh co so du lieu can banGiao trinh co so du lieu can ban
Giao trinh co so du lieu can ban
Ā 
Bai giang autoCAD smith.n ebooks
Bai giang autoCAD   smith.n ebooksBai giang autoCAD   smith.n ebooks
Bai giang autoCAD smith.n ebooks
Ā 

Viewers also liked

moodle_Admin teacher
moodle_Admin teachermoodle_Admin teacher
moodle_Admin teacher
VƵ TĆ¢m Long
Ā 
150 de tin hoc
150 de tin hoc150 de tin hoc
150 de tin hoc
VƵ TĆ¢m Long
Ā 
08 long khcn_toĆ n đį»£t
08 long khcn_toĆ n đį»£t08 long khcn_toĆ n đį»£t
08 long khcn_toĆ n đį»£t
VƵ TĆ¢m Long
Ā 
08 long 05
08 long 0508 long 05
08 long 05
VƵ TĆ¢m Long
Ā 
Raodat
RaodatRaodat
BĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violet
BĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violetBĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violet
BĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violet
VƵ TĆ¢m Long
Ā 
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
VƵ TĆ¢m Long
Ā 
Baikiemtra 8
Baikiemtra 8Baikiemtra 8
Baikiemtra 8
VƵ TĆ¢m Long
Ā 
Thį»±c hĆ nh word
Thį»±c hĆ nh wordThį»±c hĆ nh word
Thį»±c hĆ nh word
VƵ TĆ¢m Long
Ā 
Bai giang ms word [chuong 05]
Bai giang ms word   [chuong 05]Bai giang ms word   [chuong 05]
Bai giang ms word [chuong 05]
VƵ TĆ¢m Long
Ā 
Lap trinh pascal can ban
Lap trinh pascal can banLap trinh pascal can ban
Lap trinh pascal can ban
VƵ TĆ¢m Long
Ā 
Thuyįŗæt trƬnh cmts
Thuyįŗæt trƬnh cmtsThuyįŗæt trƬnh cmts
Thuyįŗæt trƬnh cmts
VƵ TĆ¢m Long
Ā 
Bai giang ms word [chuong 02]
Bai giang ms word   [chuong 02]Bai giang ms word   [chuong 02]
Bai giang ms word [chuong 02]
VƵ TĆ¢m Long
Ā 
Tn th 10_hk2
Tn th 10_hk2Tn th 10_hk2
Tn th 10_hk2
VƵ TĆ¢m Long
Ā 
GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7
GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7
GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7
VƵ TĆ¢m Long
Ā 
BƀI 22: Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø NHįŗ¤T Cį»¦A THį»°...
BƀI 22:  Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø  NHįŗ¤T Cį»¦A THį»°...BƀI 22:  Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø  NHįŗ¤T Cį»¦A THį»°...
BƀI 22: Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø NHįŗ¤T Cį»¦A THį»°...
VƵ TĆ¢m Long
Ā 
669160 esw0whit00hoa0o0viet0nam00tv0
669160 esw0whit00hoa0o0viet0nam00tv0669160 esw0whit00hoa0o0viet0nam00tv0
669160 esw0whit00hoa0o0viet0nam00tv0
VƵ TĆ¢m Long
Ā 
GiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›p
GiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›pGiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›p
GiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›p
VƵ TĆ¢m Long
Ā 

Viewers also liked (18)

moodle_Admin teacher
moodle_Admin teachermoodle_Admin teacher
moodle_Admin teacher
Ā 
150 de tin hoc
150 de tin hoc150 de tin hoc
150 de tin hoc
Ā 
08 long khcn_toĆ n đį»£t
08 long khcn_toĆ n đį»£t08 long khcn_toĆ n đį»£t
08 long khcn_toĆ n đį»£t
Ā 
08 long 05
08 long 0508 long 05
08 long 05
Ā 
Raodat
RaodatRaodat
Raodat
Ā 
BĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violet
BĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violetBĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violet
BĆ i tįŗ­p thį»±c hĆ nh tin hį»c 10_ thĘ° viį»‡n violet
Ā 
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
Ā 
Baikiemtra 8
Baikiemtra 8Baikiemtra 8
Baikiemtra 8
Ā 
Thį»±c hĆ nh word
Thį»±c hĆ nh wordThį»±c hĆ nh word
Thį»±c hĆ nh word
Ā 
Bai giang ms word [chuong 05]
Bai giang ms word   [chuong 05]Bai giang ms word   [chuong 05]
Bai giang ms word [chuong 05]
Ā 
Lap trinh pascal can ban
Lap trinh pascal can banLap trinh pascal can ban
Lap trinh pascal can ban
Ā 
Thuyįŗæt trƬnh cmts
Thuyįŗæt trƬnh cmtsThuyįŗæt trƬnh cmts
Thuyįŗæt trƬnh cmts
Ā 
Bai giang ms word [chuong 02]
Bai giang ms word   [chuong 02]Bai giang ms word   [chuong 02]
Bai giang ms word [chuong 02]
Ā 
Tn th 10_hk2
Tn th 10_hk2Tn th 10_hk2
Tn th 10_hk2
Ā 
GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7
GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7
GiĆ”o Ć”n chį»§ nhiį»‡m tuįŗ§n 1-> 7
Ā 
BƀI 22: Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø NHįŗ¤T Cį»¦A THį»°...
BƀI 22:  Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø  NHįŗ¤T Cį»¦A THį»°...BƀI 22:  Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø  NHįŗ¤T Cį»¦A THį»°...
BƀI 22: Xƃ Hį»˜I VIį»†T NAM TRONG CUį»˜C KHAI THƁC THUį»˜C Đį»ŠA Lįŗ¦N THį»Ø NHįŗ¤T Cį»¦A THį»°...
Ā 
669160 esw0whit00hoa0o0viet0nam00tv0
669160 esw0whit00hoa0o0viet0nam00tv0669160 esw0whit00hoa0o0viet0nam00tv0
669160 esw0whit00hoa0o0viet0nam00tv0
Ā 
GiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›p
GiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›pGiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›p
GiĆ”o Ć”n hoįŗ”t dį»™ng ngoĆ i giį» lĆŖn lį»›p
Ā 

Similar to Kythuatlaptrinh

Co tien hoa - Thong thien hoc
Co tien hoa - Thong thien hocCo tien hoa - Thong thien hoc
Co tien hoa - Thong thien hoc
The Golden Ages
Ā 
THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...
THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...
THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...luuguxd
Ā 
GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c   đį»— thį»‹ mĘ”[bookbooming.com]GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c   đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c đį»— thį»‹ mĘ”[bookbooming.com]bookbooming1
Ā 
Tri tue-nhan-tao-dinh-manh-tuong
Tri tue-nhan-tao-dinh-manh-tuongTri tue-nhan-tao-dinh-manh-tuong
Tri tue-nhan-tao-dinh-manh-tuongQuyĆŖn Đinh
Ā 
Qtkdqttiuluanthamkhao
QtkdqttiuluanthamkhaoQtkdqttiuluanthamkhao
Qtkdqttiuluanthamkhao
Nguyen Nhung
Ā 
Ke toan quan tri
Ke toan quan triKe toan quan tri
Ke toan quan tri
hoada610
Ā 
Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]bookbooming1
Ā 
GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n nhiį»u tĆ”c giįŗ£
GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n   nhiį»u tĆ”c giįŗ£GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n   nhiį»u tĆ”c giįŗ£
GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n nhiį»u tĆ”c giįŗ£
dongaduythuat123
Ā 
Bai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡u
Bai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡uBai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡u
Bai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡u
trinhvannam-90
Ā 
đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892
đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892
đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892
nataliej4
Ā 
Auto cad 2004
Auto cad 2004Auto cad 2004
Auto cad 2004
Lanh Nguyen
Ā 
GiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£n
GiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£nGiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£n
GiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£n
noithatcanhcam
Ā 
GiƔo TrƬnh Autocad 2D
GiƔo TrƬnh Autocad 2DGiƔo TrƬnh Autocad 2D
GiƔo TrƬnh Autocad 2D
Jenny Trinh
Ā 
Bai giang autocad_2d_va_3d
Bai giang autocad_2d_va_3dBai giang autocad_2d_va_3d
Bai giang autocad_2d_va_3d
ThyV109
Ā 
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...
Dį»‹ch vį»„ viįŗæt bĆ i trį»n gĆ³i ZALO: 0936 885 877
Ā 
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±cLuįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c
Dį»‹ch vį»„ viįŗæt thuĆŖ Luįŗ­n Văn - ZALO 0932091562
Ā 
PhĆ¢n tĆ­ch
PhĆ¢n tĆ­chPhĆ¢n tĆ­ch
PhĆ¢n tĆ­ch
tungphan1990
Ā 
Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!
Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!
Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!
Viįŗæt thuĆŖ trį»n gĆ³i ZALO 0934573149
Ā 

Similar to Kythuatlaptrinh (20)

Co tien hoa - Thong thien hoc
Co tien hoa - Thong thien hocCo tien hoa - Thong thien hoc
Co tien hoa - Thong thien hoc
Ā 
THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...
THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...
THIįŗ¾T Kįŗ¾ Kį»ø THUįŗ¬T CƔNG TRƌNH ĐƊ CHįŗ®N SƓNG Cįŗ¢NG NEO Đįŗ¬U Vƀ Cį»¬A BIį»‚N Mį»ø Ɓ ā€“ GIA...
Ā 
GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c   đį»— thį»‹ mĘ”[bookbooming.com]GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c   đį»— thį»‹ mĘ”[bookbooming.com]
GiĆ”o trƬnh nhįŗ­p mĆ“n tin hį»c đį»— thį»‹ mĘ”[bookbooming.com]
Ā 
La0008
La0008La0008
La0008
Ā 
Tri tue-nhan-tao-dinh-manh-tuong
Tri tue-nhan-tao-dinh-manh-tuongTri tue-nhan-tao-dinh-manh-tuong
Tri tue-nhan-tao-dinh-manh-tuong
Ā 
Qtkdqttiuluanthamkhao
QtkdqttiuluanthamkhaoQtkdqttiuluanthamkhao
Qtkdqttiuluanthamkhao
Ā 
Ke toan quan tri
Ke toan quan triKe toan quan tri
Ke toan quan tri
Ā 
Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]Giao trinh-phan-cung-dien-tu[bookbooming.com]
Giao trinh-phan-cung-dien-tu[bookbooming.com]
Ā 
GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n nhiį»u tĆ”c giįŗ£
GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n   nhiį»u tĆ”c giįŗ£GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n   nhiį»u tĆ”c giįŗ£
GiĆ”o trƬnh thį»§y lį»±c vĆ  khĆ­ nĆ©n nhiį»u tĆ”c giįŗ£
Ā 
Chuong 1
Chuong 1Chuong 1
Chuong 1
Ā 
Bai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡u
Bai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡uBai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡u
Bai giang hį»‡ quįŗ£n trį»‹ cĘ” sį»Ÿ dį»Æ liį»‡u
Ā 
đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892
đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892
đį»“ Ć”N thiįŗæt kįŗæ phĆ¢n xĘ°į»Ÿng sįŗ£n xuįŗ„t phenol cĆ“ng suįŗ„t 78000 tįŗ„n năm 3547892
Ā 
Auto cad 2004
Auto cad 2004Auto cad 2004
Auto cad 2004
Ā 
GiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£n
GiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£nGiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£n
GiĆ”o trƬnh AutoCAD tiįŗæng viį»‡t cĘ” bįŗ£n
Ā 
GiƔo TrƬnh Autocad 2D
GiƔo TrƬnh Autocad 2DGiƔo TrƬnh Autocad 2D
GiƔo TrƬnh Autocad 2D
Ā 
Bai giang autocad_2d_va_3d
Bai giang autocad_2d_va_3dBai giang autocad_2d_va_3d
Bai giang autocad_2d_va_3d
Ā 
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c į»Ÿ PhĆ¢n hiį»‡u Đįŗ”i...
Ā 
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±cLuįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c
Luįŗ­n văn: Biį»‡n phĆ”p Quįŗ£n lĆ½ xĆ¢y dį»±ng tįŗ­p thį»ƒ sĘ° phįŗ”m tĆ­ch cį»±c
Ā 
PhĆ¢n tĆ­ch
PhĆ¢n tĆ­chPhĆ¢n tĆ­ch
PhĆ¢n tĆ­ch
Ā 
Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!
Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!
Luįŗ­n văn: HoĆ n thiį»‡n chĆ­nh sĆ”ch phĆ¢n phį»‘i sįŗ£n phįŗ©m, 9 ĐIį»‚M!
Ā 

More from VƵ TĆ¢m Long

Chuanhk2
Chuanhk2Chuanhk2
Chuanhk2
VƵ TĆ¢m Long
Ā 
Chuanhk1
Chuanhk1Chuanhk1
Chuanhk1
VƵ TĆ¢m Long
Ā 
Chuan
ChuanChuan
Ly p han 2
Ly p han 2Ly p han 2
Ly p han 2
VƵ TĆ¢m Long
Ā 
Phuongphap
PhuongphapPhuongphap
Phuongphap
VƵ TĆ¢m Long
Ā 
HƓa 11
HƓa 11HƓa 11
HƓa 11
VƵ TĆ¢m Long
Ā 
Bai tap hoa hoc lop 11 ca nam
Bai tap hoa hoc lop 11 ca namBai tap hoa hoc lop 11 ca nam
Bai tap hoa hoc lop 11 ca nam
VƵ TĆ¢m Long
Ā 
200211 gubryaltphcmhanoidansodichuyennoithi
200211 gubryaltphcmhanoidansodichuyennoithi200211 gubryaltphcmhanoidansodichuyennoithi
200211 gubryaltphcmhanoidansodichuyennoithi
VƵ TĆ¢m Long
Ā 
7 chuyenkhao dicu-dothihoa
7 chuyenkhao dicu-dothihoa7 chuyenkhao dicu-dothihoa
7 chuyenkhao dicu-dothihoa
VƵ TĆ¢m Long
Ā 
ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015
ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015
ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015
VƵ TĆ¢m Long
Ā 
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
VƵ TĆ¢m Long
Ā 
Dioxin office
Dioxin officeDioxin office
Dioxin office
VƵ TĆ¢m Long
Ā 
Dioxin office
Dioxin officeDioxin office
Dioxin office
VƵ TĆ¢m Long
Ā 
Vu kien chat doc mau da cam
Vu kien chat doc mau da camVu kien chat doc mau da cam
Vu kien chat doc mau da cam
VƵ TĆ¢m Long
Ā 
Nvt phanquyet jw
Nvt phanquyet jwNvt phanquyet jw
Nvt phanquyet jw
VƵ TĆ¢m Long
Ā 
Vu kien chat doc mau da cam
Vu kien chat doc mau da camVu kien chat doc mau da cam
Vu kien chat doc mau da cam
VƵ TĆ¢m Long
Ā 
Raodat
RaodatRaodat
Raodat
RaodatRaodat
Raodat
RaodatRaodat
Bai giang ms word [chuong 06]
Bai giang ms word   [chuong 06]Bai giang ms word   [chuong 06]
Bai giang ms word [chuong 06]
VƵ TĆ¢m Long
Ā 

More from VƵ TĆ¢m Long (20)

Chuanhk2
Chuanhk2Chuanhk2
Chuanhk2
Ā 
Chuanhk1
Chuanhk1Chuanhk1
Chuanhk1
Ā 
Chuan
ChuanChuan
Chuan
Ā 
Ly p han 2
Ly p han 2Ly p han 2
Ly p han 2
Ā 
Phuongphap
PhuongphapPhuongphap
Phuongphap
Ā 
HƓa 11
HƓa 11HƓa 11
HƓa 11
Ā 
Bai tap hoa hoc lop 11 ca nam
Bai tap hoa hoc lop 11 ca namBai tap hoa hoc lop 11 ca nam
Bai tap hoa hoc lop 11 ca nam
Ā 
200211 gubryaltphcmhanoidansodichuyennoithi
200211 gubryaltphcmhanoidansodichuyennoithi200211 gubryaltphcmhanoidansodichuyennoithi
200211 gubryaltphcmhanoidansodichuyennoithi
Ā 
7 chuyenkhao dicu-dothihoa
7 chuyenkhao dicu-dothihoa7 chuyenkhao dicu-dothihoa
7 chuyenkhao dicu-dothihoa
Ā 
ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015
ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015
ĐƓ thį»‹ hĆ³a TP.HCM 1986-2015
Ā 
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
HoĆ n cįŗ£nh lį»‹ch sį»­ vĆ  đʰį»ng lį»‘i cį»§a đįŗ£ng tį»« năm 1930 đįŗæn năm 1939
Ā 
Dioxin office
Dioxin officeDioxin office
Dioxin office
Ā 
Dioxin office
Dioxin officeDioxin office
Dioxin office
Ā 
Vu kien chat doc mau da cam
Vu kien chat doc mau da camVu kien chat doc mau da cam
Vu kien chat doc mau da cam
Ā 
Nvt phanquyet jw
Nvt phanquyet jwNvt phanquyet jw
Nvt phanquyet jw
Ā 
Vu kien chat doc mau da cam
Vu kien chat doc mau da camVu kien chat doc mau da cam
Vu kien chat doc mau da cam
Ā 
Raodat
RaodatRaodat
Raodat
Ā 
Raodat
RaodatRaodat
Raodat
Ā 
Raodat
RaodatRaodat
Raodat
Ā 
Bai giang ms word [chuong 06]
Bai giang ms word   [chuong 06]Bai giang ms word   [chuong 06]
Bai giang ms word [chuong 06]
Ā 

Recently uploaded

30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf
30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf
30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf
ngocnguyensp1
Ā 
Sinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsg
Sinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsgSinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsg
Sinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsg
vivan030207
Ā 
ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2
ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2
ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2
nhanviet247
Ā 
PowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptx
PowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptxPowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptx
PowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptx
PhuongMai559533
Ā 
CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...
CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...
CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...
Nguyen Thanh Tu Collection
Ā 
Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptx
Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptxDįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptx
Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptx
nvlinhchi1612
Ā 
Chuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTU
Chuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTUChuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTU
Chuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTU
nvlinhchi1612
Ā 
ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)
ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)
ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)
duykhoacao
Ā 
chĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæ
chĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæchĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæ
chĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæ
Qucbo964093
Ā 
Hį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docx
Hį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docxHį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docx
Hį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docx
giangnguyen312210254
Ā 
Chʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.ppt
Chʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.pptChʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.ppt
Chʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.ppt
PhiTrnHngRui
Ā 
NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ 
NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ 
NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ 
onLongV
Ā 
įŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nay
įŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nayįŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nay
įŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nay
chinhkt50
Ā 

Recently uploaded (13)

30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf
30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf
30 - ĐEĢ‚Ģ€ THI HSG - HOĢA HOĢ£C 9 - NAĢ†M HOĢ£C 2021 - 2022.pdf
Ā 
Sinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsg
Sinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsgSinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsg
Sinh-12-ChuyĆŖn-2022-2023.dĆ nh cho Ć“n thi hsg
Ā 
ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2
ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2
ƔN-Tįŗ¬P-CHĘÆĘ NG1 Lį»‹ch sį»­ đįŗ£ng Viį»‡t Nam chį»§ đį» 2
Ā 
PowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptx
PowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptxPowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptx
PowerPoint Đuį»•i hƬnh bįŗÆt chį»Æ. hay vui cĆ³ thĘ°ognrpptx
Ā 
CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...
CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...
CHUYƊN Đį»€ Bį»’I DĘÆį» NG Hį»ŒC SINH GIį»ŽI KHOA Hį»ŒC Tį»° NHIƊN 9 CHĘÆĘ NG TRƌNH Mį»šI - PHįŗ¦N...
Ā 
Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptx
Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptxDįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptx
Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - Tu vung ngu nghia.pptx
Ā 
Chuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTU
Chuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTUChuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTU
Chuong 2 Ngu am hoc - Dįŗ«n luįŗ­n ngĆ“n ngį»Æ - FTU
Ā 
ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)
ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)
ChĘ°Ę”ng III (Nį»™i dung vįŗ½ sĘ” đį»“ tĘ° duy chĘ°Ę”ng 3)
Ā 
chĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæ
chĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæchĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæ
chĘ°Ę”ng 4 vÄ© mĆ“.pdf file bĆ i hį»c bį»™ mĆ“n kinh tįŗæ
Ā 
Hį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docx
Hį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docxHį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docx
Hį»† THį»NG 432 CƂU Hį»ŽI TRįŗ®C NGHIį»†M MƔN TTHCM.docx
Ā 
Chʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.ppt
Chʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.pptChʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.ppt
Chʰʔng 3 Linh kien ban dan vƠ KD dien tu - Copy.ppt
Ā 
NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ 
NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ 
NgĆ¢n hĆ ng điį»‡n tį»­ sį»‘ ptit - giįŗ£ng viĆŖn cĆ“ HĆ 
Ā 
įŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nay
įŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nayįŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nay
įŗ¢nh hĘ°į»Ÿng cį»§a nhĆ¢n sinh quan Phįŗ­t giĆ”o đįŗæn đį»i sį»‘ng tinh thįŗ§n Viį»‡t Nam hiį»‡n nay
Ā 

Kythuatlaptrinh

  • 1. TRƖƔƘNG ƑAƏI HOƏC ƑAƘ LAƏT GIAƙO TRƌNH KYƕ THUAƄT LAƄP TRƌNH NAƂNG CAO TRAƀN HOAƘNG THOƏ 2002
  • 2. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 2 - MUƏC LUƏC LƔƘI NOƙI ƑAƀU ........................................................................................................................4 PHAƀN I....................................................................................................................................5 CHƖƔNG I .............................................................................................................................5 I. MƔƛ ƑAƀU ...........................................................................................................................5 1. MoĆ¢ taĆ» ƱeƤ quy................................................................................................................5 2. CaĆ¹c loaĆÆi ƱeƤ quy ............................................................................................................6 II. MOƂ TAƛ ƑEƄ QUY CAƙC CAƁU TRUƙC DƖƕ LIEƄU...................................................................7 III. MOƂ TAƛ ƑEƄ QUY GIAƛI THUAƄT........................................................................................7 1. GiaĆ»i thuaƤt ƱeƤ quy..........................................................................................................7 2. ChƶƓng trƬnh con ƱeƤ quy..............................................................................................8 3. MaƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ qui trong caĆ¹c ngoĆ¢n ngƶƵ laƤp trƬnh. .............................................11 4. MoƤt soĆ” daĆÆng giaĆ»i thuaƤt ƱeƤ quy ƱƓn giaĆ»n thƶƓĆøng gaĆ«p . ..............................................13 CHƖƔNG II ...........................................................................................................................16 I. CAƙC NOƄI DUNG CAƀN LAƘM ƑEƅ TƌM GIAƛI THUAƄT ƑEƄ QUY CHO MOƄT BAƘI TOAƙN. .....16 1. ThoĆ¢ng soĆ” hoaĆ¹ baĆøi toaĆ¹n...............................................................................................16 2. PhaĆ¹t hieƤn caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n (neo) vaĆø tƬm giaĆ»i thuaƤt cho caĆ¹c trƶƓĆøng hĆ“ĆÆp naĆøy.16 3. PhaĆ¢n raƵ baĆøi toaĆ¹n toĆ„ng quaĆ¹t theo phƶƓng thĆ¶Ć¹c ƱeƤ quy. ..............................................16 II. MOƄT SOƁ BAƘI TOAƙN GIAƛI BAƈNG GIAƛI THUAƄT ƑEƄ QUY ƑIEƅN HƌNH...........................17 1. BaĆøi toaĆ¹n thaĆ¹p HaĆø NoƤi . ...............................................................................................17 2. BaĆøi toaĆ¹n chia thƶƓƻng. .................................................................................................19 3. BaĆøi toaĆ¹n tƬm taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² cuĆ»a moƤt daƵy phaĆ n tƶƻ.................................................21 4. BaĆøi toaĆ¹n saĆ©p xeĆ”p maĆ»ng baĆØng phƶƓng phaĆ¹p troƤn (Sort-Merge)..................................24 5. BaĆøi toaĆ¹n tƬm nghieƤm xaĆ”p xƦ cuĆ»a phƶƓng trƬnh f(x)=0 . ...............................................25 CHƖƔNG III ..........................................................................................................................28 I. CƔ CHEƁ THƖƏC HIEƄN GIAƛI THUAƄT ƑEƄ QUY................................................................28 II. TOƅNG QUAN VEƀ VAƁN ƑEƀ KHƖƛƻ ƑEƄ QUY.....................................................................32 III. CAƙC TRƖƔƘNG HƔƏP KHƖƛ ƑEƄ QUY ƑƔN GIAƛN. .........................................................33 1. CaĆ¹c trƶƓĆøng hĆ“ĆÆp khƶƻ ƱeƤ quy baĆØng voĆøng laĆ«p . ............................................................33 2. Khƶƻ ƱeƤ quy haĆøm ƱeƤ quy arsac..................................................................................41 3. Khƶƻ ƱeƤ quy moƤt soĆ” daĆÆng thuĆ» tuĆÆc ƱeƤ quy thƶƓĆøng gaĆ«p. ...............................................45 PhaĆ n II ..................................................................................................................................52 CHƖƔNG IV..........................................................................................................................52 I. CAƙC GIAI ƑOAƏN TRONG CUOƄC SOƁNG CUƛA MOƄT PHAƀN MEƀM .................................52 1) ƑaĆ«c taĆ» baĆøi toaĆ¹n ..........................................................................................................52 2) XaĆ¢y dƶĆÆng heƤ thoĆ”ng ....................................................................................................52 3) Sƶƻ duĆÆng vaĆø baĆ»o trƬ heƤ thoĆ”ng ......................................................................................53 II. ƑAƋC TAƛ.........................................................................................................................53 1. ƑaĆ«c taĆ» baĆøi toaĆ¹n...........................................................................................................53 2. ƑaĆ«c taĆ» chƶƓng trƬnh (ƑTCT).......................................................................................54 3. ƑaĆ«c taĆ» ƱoaĆÆn chƶƓng trƬnh ..........................................................................................55 III. NGOƂN NGƖƕ LAƄP TRƌNH..............................................................................................57 CHƖƔNG V..........................................................................................................................59 I. CAƙC KHAƙI NIEƄM VEƀ TƍNH ƑUƙNG. ................................................................................59 II. HEƄ LUAƄT HOARE (HOARES INFERENCE RULES). ...................................................59 1. CaĆ¹c luaƤt heƤ quaĆ» (Consequence rules) .......................................................................60 TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 3. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 3 - 2. TieĆ¢n ƱeĆ  gaĆ¹n (The Assignement Axiom) .....................................................................61 3. CaĆ¹c luaƤt veĆ  caĆ¹c caĆ”u truĆ¹c ƱieĆ u khieĆ„n . ........................................................................61 III. KIEƅM CHƖƙNG ƑOAƏN CHƖƔNG TRƌNH KHOƂNG COƙ VOƘNG LAƋP. .............................64 IV. KIEƅM CHƖƙNG ƑOAƏN CHƖƔNG TRƌNH COƙ VOƘNG LAƋP............................................68 1. BaĆ”t bieĆ”n......................................................................................................................68 2. LyĆ¹ luaƤn quy naĆÆp vaĆø chĆ¶Ć¹ng minh baĆØng quy naĆÆp..........................................................70 3. KieĆ„m chĆ¶Ć¹ng chƶƓng trƬnh coĆ¹ voĆøng laĆ«p while. .............................................................71 CHƖƔNG VI.........................................................................................................................76 I. CAƙC KHAƙI NIEƄM...........................................................................................................76 1. ƑaĆ«t vaĆ”n ƱeĆ . ................................................................................................................76 2. Ć‘Ć²nh nghĆ³a WP(S,Q)...................................................................................................76 3. HeƤ quaĆ» cuĆ»a Ć±Ć²nh nghĆ³a...............................................................................................76 4. CaĆ¹c vĆ­ duĆÆ....................................................................................................................77 II. TƍNH CHAƁT CUƛA WP....................................................................................................77 III. CAƙC PHEƙP BIEƁN ƑOƅI TAƂN TƖƘ....................................................................................78 1. ToaĆ¹n tƶƻ gaĆ¹n (tieĆ¢n ƱeĆ  gaĆ¹n). .........................................................................................78 2. ToaĆ¹n tƶƻ tuaĆ n tƶĆÆ...........................................................................................................78 3. ToaĆ¹n tƶƻ ƱieĆ u kieƤn. ......................................................................................................79 4. ToaĆ¹n tƶƻ laĆ«p.................................................................................................................80 IV. LƖƔƏC ƑOƀ KIEƅM CHƖƙNG HƔƏP LYƙ VAƘ CAƙC ƑIEƀU KIEƄN CAƀN KIEƅM CHƖƙNG............84 1. LƶƓĆÆc ƱoĆ  kieĆ„m chĆ¶Ć¹ng. .................................................................................................84 2. KieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng................................................................................................85 3. TaƤp toĆ”i tieĆ„u caĆ¹c ƱieĆ u kieƤn caĆ n kieĆ„m chĆ¶Ć¹ng. ...............................................................93 PHU LUƏC ..............................................................................................................................96 I. LOGIC TOAƙN..................................................................................................................96 II. LOGIC MEƄNH ƑEƀ..........................................................................................................96 1. PhaĆ¢n tĆ­ch....................................................................................................................96 2. CaĆ¹c lieĆ¢n tƶĆø logic. ........................................................................................................97 3. YƙnghĆ³a cuĆ»a caĆ¹c lieĆ¢n tƶĆø Logic. BaĆ»ng chaĆ¢n trĆ². .............................................................97 4. LyĆ¹ luaƤn ƱuĆ¹ng. .............................................................................................................98 5. TƶƓng ƱƶƓng (Equivalence)......................................................................................99 6. TĆ­nh thay theĆ”, tĆ­nh truyeĆ n vaĆø tĆ­nh ƱoĆ”i xĆ¶Ć¹ng...............................................................100 7. BaĆøi toaĆ¹n suy dieĆ£n logic.........................................................................................100 8. CaĆ¹c luaƤt suy dieĆ£n (rules of inference). .....................................................................102 III. LOGIC TAƂN TƖƘ. .........................................................................................................103 1. KhaĆ¹i nieƤm.................................................................................................................103 2. CaĆ¹c lƶƓĆÆng tƶĆø logic ....................................................................................................105 3. TaƤp hĆ“ĆÆp vaĆø taĆ¢n tƶƘ.....................................................................................................107 4. CaĆ¹c lƶƓĆÆng tƶĆø soĆ” hoĆÆc.................................................................................................107 TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 4. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 4 - LƔƘI NOƙI ƑAƀU GiaĆ¹o trƬnh ƱƶƓĆÆc vieĆ”t theo noƤi dung moĆ¢n hoĆÆc ā€œ KyƵ thuaƤt laƤp trƬnh naĆ¢ng caoā€ vĆ“Ć¹i muĆÆc Ʊƭch laĆøm taĆøi lieƤu tham khaĆ»o chĆ­nh cho moĆ¢n hoĆÆc. GiaĆ¹o trƬnh goĆ m 2 phaĆ n chĆ­nh vaĆø moƤt phuĆÆ luĆÆc : PhaĆ n I. ƑeƤ quy. TrƬnh baĆøy veĆ  chuĆ» ƱeĆ  ƱeƤ quy trong laƤp trƬnh bao goĆ m caĆ¹c noƤi dung sau : - KhaĆ¹i nieƤm ƱeƤ quy vaĆø vai troĆø cuĆ»a noĆ¹ trong laƤp trƬnh. - CaĆ¹ch xaĆ¢y dƶĆÆng moƤt giaĆ»i thuaƤt cho moƤt baĆøi toaĆ¹n baĆØng phƶƓng phaĆ¹p ƱeƤ quy. - CĆ“ cheĆ” thƶĆÆc hieƤn moƤt giaĆ»i thuaƤt ƱeƤ quy. - Khƶƻ ƱeƤ quy. PhaĆ n II. KieĆ„m chĆ¶Ć¹ng chƶƓng trƬnh. TrƬnh baĆøy veĆ  chuĆ» ƱeĆ  kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng cuĆ»a chƶƓng trƬnh bao goĆ m caĆ¹c noƤi dung sau: - Vai troĆø cuĆ»a vaĆ”n ƱeĆ  kieĆ„m chĆ¶Ć¹ng trong laƤp trƬnh. - CaĆ¹c phƶƓng phaĆ¹p duĆøng ƱeĆ„ kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng . - HeƤ luaƤt Hoare vaĆø aĆ¹p duĆÆng cuĆ»a noĆ¹ vaĆøo kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng coĆ¹ ƱieĆ u kieƤn. - HeƤ luaƤt Dijkstra vaĆø aĆ¹p duĆÆng cuĆ»a noĆ¹ vaĆøo kieĆ„m chĆ¶Ć¹ng tĆ­nh ƱuĆ¹ng ƱaĆ y ƱuĆ». - DaĆÆng toĆ„ng quaĆ¹t cuĆ»a baĆøi toaĆ¹n kieĆ„m chĆ¶Ć¹ng vaĆø phƶƓng phaĆ¹p kieĆ„m chĆ¶Ć¹ng. CaĆ¹c lƶƓĆÆc ƱoĆ  kieĆ„m chĆ¶Ć¹ng vaĆø taƤp toĆ”i thieĆ„u caĆ¹c ƱieĆ u kieƤn caĆ n kieĆ„m chĆ¶Ć¹ng. PhuĆÆ luĆÆc . CaĆ¹c kieĆ”n thĆ¶Ć¹c chung veĆ  logic. TrƬnh baĆøy caĆ¹c kieĆ”n thĆ¶Ć¹c ban ƱaĆ u veĆ  logic meƤnh ƱeĆ  vaĆø logic taĆ¢n tƶĆø. PhuĆÆ luĆÆc cung caĆ”p moƤt moƤt taĆøi lieƤu coĆ¢ ƱoĆÆng veĆ  caĆ¹c kieĆ”n thĆ¶Ć¹c logic aĆ¹p duĆÆng trƶĆÆc tieĆ”p trong phaĆ n I vaĆø phaĆ n II ( noĆ¹ laĆø moƤt phaĆ n noĆ¢i dung cuĆ»a giaĆ¹o trƬnh nhaƤp moĆ¢n toaĆ¹n) ngƶƓĆøi hoĆÆc caĆ n daĆønh thĆ“Ćøi gian thĆ­ch hĆ“ĆÆp oĆ¢n laĆÆi ƱeĆ„ coĆ¹ theĆ„ theo kĆ²p hĆ¶Ć“Ć¹ng tieĆ”p caƤn cuĆ»a giaĆ¹o trƬnh. CuĆøng vĆ“Ć¹i nhƶƵng trƬnh baĆøy lyĆ¹ thuyeĆ”t toĆ„ng quaĆ¹t, taĆ¹c gƦa Ʊƶa vaĆøo moƤt soĆ” thoĆ»a ƱaĆ¹ng caĆ¹c vĆ­ duĆÆ choĆÆn loĆÆc nhaĆØm giuĆ¹p ngƶƓĆøi hoĆÆc naĆ©m baĆ©t ƱƶƓĆÆc baĆ»n chaĆ”t cuĆ»a caĆ¹c khaĆ¹i nieƤm, caĆ¹c phƶƓng phaĆ¹p mĆ“Ć¹i vaĆø laĆøm quen vĆ“Ć¹i caĆ¹ch sƶƻ duĆÆng caĆ¹c keĆ”t quĆ»a mĆ“Ć¹i. Khi hoĆÆc trĆ¶Ć“Ć¹c khi tƬm caĆ¹ch giaĆ»i caĆ¹c baĆøi taƤp cuĆ»a thaĆ y gĆ­ao cung caĆ”p caĆ¹c baĆÆn coĆ” gaĆ©ng ƱoĆÆc vaĆø hieĆ„u heĆ”t caĆ¹c vĆ­ duĆÆ minh hoĆÆa. VƬ nhieĆ u leƵ chaĆ©c chaĆ©n giaĆ¹o trƬnh coĆøn nhieĆ u khieĆ”m khuyeĆ”t. RaĆ”t mong taĆ”t caĆ» moĆÆi ngƶƓĆøi sƶƻ duĆÆng chaĆ¢n thaĆønh goĆ¹p yĆ¹. TaĆ¹c giaĆ» chaĆ¢n thaĆønh caĆ»m Ć“n caĆ¹c ƱoĆ ng nghieƤp trong khoa ToaĆ¹n_Tin ƱaƵ ƱoĆ¹ng goĆ¹p nhieĆ u yĆ¹ kieĆ”n quyĆ¹ baĆ¹u cho vieƤc hƬnh thaĆønh caĆ”u truĆ¹c chi tieĆ”t cho noƤi dung giaĆ¹o trƬnh, chaĆ¢n thaĆønh caĆ»m Ć“n thaĆÆc syƵ VoƵ TieĆ”n ƱaƵ ƱoĆ¹ng goĆ¹p nhieĆ u yĆ¹ kieĆ”n quyĆ¹ baĆ¹u trong caĆ”u truĆ¹c giaĆ¹o trƬnh, giuĆ¹p chƦnh lyĆ¹ nhieĆ u khieĆ”m khuyeĆ”t trong baĆ»n thaĆ»o. ƑaLat ngaĆøy 01 thaĆ¹ng 12 naĆŖm 2002 TRAƀN HOAƘNG THOƏ TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 5. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 5 - PHAƀN I ƑEƄ QUY CHƖƔNG I KHAƙI NIEƄM ƑEƄ QUY I. MƔƛ ƑAƀU 1. MoĆ¢ taĆ» ƱeƤ quy Trong nhieĆ u tƬnh huoĆ”ng vieƤc moĆ¢ taĆ» caĆ¹c baĆøi toaĆ¹n, caĆ¹c giaĆ»i thuaƤt, caĆ¹c sƶĆÆ kieƤn, caĆ¹c sƶĆÆ vaƤt caĆ¹c quaĆ¹ trƬnh, caĆ¹c caĆ”u truĆ¹c, . . . seƵ ƱƓn giaĆ»n vaĆø hieƤu quaĆ» hĆ“n neĆ”u ta nhƬn ƱƶƓĆÆc noĆ¹ dĆ¶Ć“Ć¹i goĆ¹c ƱoƤ mang tĆ­nh ƱeƤ qui. MoĆ¢ taĆ» mang tĆ­nh ƱeƤ qui veĆ  moƤt ƱoĆ”i tƶƓĆÆng laĆø moĆ¢ taĆ» theo caĆ¹ch phaĆ¢n tĆ­ch ƱoĆ”i tƶƓĆÆng thaĆønh nhieĆ u thaĆønh phaĆ n maĆø trong soĆ” caĆ¹c thaĆønh phaĆ n coĆ¹ thaĆønh phaĆ n mang tĆ­nh chaĆ”t cuĆ»a chĆ­nh ƱoĆ”i tƶƓĆÆng ƱƶƓĆÆc moĆ¢ taĆ». TĆ¶Ć¹c laĆø moĆ¢ taĆ» ƱoĆ”i tƶƓĆÆng qua chĆ­nh noĆ¹. CaĆ¹c vĆ­ duĆÆ : - MoĆ¢ taĆ» ƱeƤ quy taƤp soĆ” tƶĆÆ nhieĆ¢n N : + SoĆ” 1 laĆø soĆ” tƶĆÆ nhieĆ¢n ( 1 āˆˆ N) . + SoĆ” tƶĆÆ nhieĆ¢n baĆØng soĆ” tƶĆÆ nhieĆ¢n coƤng 1 . ( n āˆˆ N ā‡’ ( n +1 ) āˆˆ N ) - MoĆ¢ taĆ» ƱeƤ quy caĆ”u truĆ¹c xaĆ¢u (list) kieĆ„u T : + CaĆ”u truĆ¹c roĆ£ng laĆø moƤt xaĆ¢u kieĆ„u T. + GheĆ¹p noĆ”i moƤt thaĆønh phaĆ n kieĆ„u T(nuĆ¹t kieĆ„u T ) vĆ“Ć¹i moƤt xaĆ¢u kieĆ„u T ta coĆ¹ moƤt xaĆ¢u kieĆ„u T. - MoĆ¢ taĆ» ƱeƤ quy caĆ¢y gia phaĆ» : Gia phaĆ» cuĆ»a moƤt ngƶƓĆøi bao goĆ m mgƶƓĆøi ƱoĆ¹ vaĆø gia phaĆ» cuĆ»a cha vaĆø gia phaĆ» cuĆ»a meĆÆ. - MoĆ¢ taĆ» ƱeĆ¢ quy thuĆ» tuĆÆc choĆÆn hoa haƤu : + ChoĆÆn hoa haƤu cuĆ»a tƶĆøng khu vƶĆÆc. + ChoĆÆn hoa haƤu cuĆ»a caĆ¹c hoa haƤu. - MoĆ¢ taĆ» ƱeƤ quy thuĆ» tuĆÆc saĆ©p taĆŖng daƵy a[m:n] ( daƵy a[m], a[m+1], . . . , a[n] ) baĆØng phƶƓng phaĆ¹p Sort_Merge (SM) : SM (a[m:n]) ā‰” Merge ( SM(a[m : (n+m) div 2]) , SM (a[(n+m) div 2 +1 : n] ) VĆ“Ć¹i : SM (a[x : x]) laĆø thao taĆ¹c roĆ£ng (khoĆ¢ng laĆøm gƬ caĆ» ). Merge (a[x : y] , a[(y+1) : z]) laĆø thuĆ» tuĆÆc troƤn 2 daƵy taĆŖng a [x : y] , a[(y+1) : z] ƱeĆ„ ƱƶƓĆÆc moƤt daƵy a[x : z] taĆŖng. - Ƒinh nghĆ³a ƱeƤ quy haĆøm giai thƶĆøa FAC( n) = n ! 0 ! = 1 n ! = n * ( n - 1 ) ! TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 6. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 6 - PhƶƓng phaĆ¹p ƱeƤ quy maĆÆnh Ć“Ć» choĆ„ noĆ¹ cho pheĆ¹p moĆ¢ taĆ» moƤt taƤp lĆ“Ć¹n caĆ¹c ƱoĆ”i tƶƓĆÆng chƦ bĆ“Ć»i moƤt soĆ” Ć­t caĆ¹c meƤnh ƱeĆ  hoaĆ«c moĆ¢ taĆ» moƤt giaĆ»i thuaƤt phĆ¶Ć¹c taĆÆp baĆØng moƤt soĆ” Ć­t caĆ¹c thao taĆ¹c (moƤt chƶƓng trƬnh con ƱeƤ quy). MoƤt moĆ¢ taĆ» ƱeƤ quy ƱaĆ y ƱuĆ» goĆ m 2 phaĆ n : - PhaĆ n neo : moĆ¢ taĆ» caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n cuĆ»a ƱoĆ”i tƶƓĆÆng (giaĆ»i thuaƤt) qua moƤt caĆ”u truĆ¹c (thao taĆ¹c) cuĆÆ theĆ„ xaĆ¹c Ć±Ć²nh . vĆ­ duĆÆ: 1 laĆø soĆ” tƶĆÆ nhieĆ¢n, caĆ”u truĆ¹c roĆ£ng laĆø moƤt xaĆ¢u kieĆ„u T, 0 ! = 1 , SM (a[x:x]) laĆø thao taĆ¹c roĆ£ng. - PhaĆ n quy naĆÆp: moĆ¢ taĆ» ƱoĆ”i tƶƓĆÆng (giaĆ»i thuaƤt) trong trƶƓĆøng hĆ“ĆÆp phoĆ„ bieĆ”n thoĆ¢ng qua chĆ­nh ƱoĆ”i tƶƓĆÆng (giaĆ»i thuaƤt ) ƱoĆ¹ moƤt caĆ¹ch trƶĆÆc tieĆ”p hoaĆ«c giaĆ¹n tieĆ”p. VĆ­ duĆÆ : n! = n * (n ā€“ 1) ! SM (a[m:n]) ā‰” Merge (SM (a[m:( m+n) div 2] , SM (a[(m+n) div 2 +1 : n]) ) NeĆ”u trong moĆ¢ taĆ» khoĆ¢ng coĆ¹ phaĆ n neo thƬ ƱoĆ”i tƶƓĆÆng moĆ¢ taĆ» coĆ¹ caĆ”u truĆ¹c lĆ“Ć¹n voĆ¢ haĆÆn, giaĆ»i thuaƤt moĆ¢ taĆ» trĆ“Ć» thaĆønh caĆ”u truĆ¹c laĆ«p voĆ¢ taƤn. 2. CaĆ¹c loaĆÆi ƱeƤ quy NgƶƓĆøi ta phaĆ¢n ƱeƤ quy thaĆønh 2 loaĆÆi : ƑeƤ quy trƶĆÆc tieĆ”p, ƱeƤ quy giaĆ¹n tieĆ”p. - ƑeƤ quy trƶĆÆc tieĆ”p laĆø loaĆÆi ƱeƤ quy maĆø ƱoĆ”i tƶƓĆÆng ƱƶƓĆÆc moĆ¢ taĆ» trƶĆÆc tieĆ”p qua noĆ¹ : A moĆ¢ taĆ» qua A, B, C,...trong ƱoĆ¹ B, C, ... khoĆ¢ng chĆ¶Ć¹a A. (caĆ¹c vĆ­ duĆÆ treĆ¢n). - ƑeƤ quy giaĆ¹n tieĆ”p laĆø loaĆÆi ƱeƤ quy maĆø ƱoĆ”i tƶƓĆÆng ƱƶƓĆÆc moĆ¢ taĆ» giaĆ¹n tieĆ”p qua noĆ¹ : A moĆ¢ taĆ» qua A1 ,A2 ,..., An .Trong ƱoĆ¹ coĆ¹ moƤt Ai ƱƶƓĆÆc moĆ¢ taĆ» qua A. VĆ­ duĆÆ 1: MoĆ¢ taĆ» daĆÆng toĆ„ng quaĆ¹t moƤt chƶƓng trƬnh vieĆ”t treĆ¢n NNLT Pascal : MoƤt ChƶƓng trƬnh Pascal goĆ m : a) ƑaĆ u chƶƓng trƬnh (head) goĆ m: Program TeĆ¢n ; b) ThaĆ¢n chƶƓng trƬnh (blok) goĆ m : b1) Khai baĆ¹o unit, Ć±Ć²nh nghĆ³a haĆØng, nhaƵn, kieĆ„u dƶƵ lieƤu, khaĆ¹i baĆ¹o bieĆ”n. b2) Ć‘Ć²nh nghĆ³a caĆ¹c chƶƓng trƬnh con goĆ m : b2.1) ƑaĆ u chƶƓng trƬnh con : Procedure TeĆ¢n thuĆ» tuĆÆc ( danh saĆ¹ch thoĆ¢ng soĆ” hƬnh thĆ¶Ć¹c ) ; hoaĆ«c Function TeĆ¢n haĆøm ( danh saĆ¹ch thoĆ¢ng soĆ” hƬnh thĆ¶Ć¹c ) : KieĆ„u ; b2.2) ThaĆ¢n chƶƓng trƬnh con ( Blok ) b2.3) DaĆ”u ā€˜ ; ā€˜ b3) PhaĆ n leƤnh : laĆø moƤt leƤnh gheĆ¹p daĆÆng : Begin S1 ; S2 ; . . . ; Sn End ; c) DaĆ”u keĆ”t thuĆ¹c chƶƓng trƬnh : ā€˜.ā€™ VĆ­ duĆÆ 2 : MoĆ¢ taĆ» hai daƵy soĆ” {Xn},{Yn} theo luaƤt ƱeƤ quy hoĆ„ tƶƓng nhƶ sau : X0 = 1 ; Xn = Xn-1 + Yn-1 ; Y0 = 1 ; Yn =n2 Xn-1 + Yn-1 ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 7. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 7 - II. MOƂ TAƛ ƑEƄ QUY CAƙC CAƁU TRUƙC DƖƕ LIEƄU Trong toaĆ¹n hoĆÆc , trong laƤp trƬnh ngƶƓĆøi ta thƶƓĆøng sƶƻ duĆÆng ƱeƤ quy ƱeĆ„ moĆ¢ taĆ» caĆ¹c caĆ”u truĆ¹c phĆ¶Ć¹c taĆÆp, coĆ¹ tĆ­nh ƱeƤ quy . BĆ“Ć»i moĆ¢ taĆ» ƱeƤ quy khoĆ¢ng chƦ laĆø caĆ¹ch moĆ¢ taĆ» ngaĆ©n goĆÆn caĆ¹c caĆ”u truĆ¹c phĆ¶Ć¹c taĆÆp maĆø coĆøn taĆÆo khaĆ» naĆŖng ƱeĆ„ xaĆ¢y dƶĆÆng caĆ¹c thao taĆ¹c xƶƻ lyĆ¹ treĆ¢n caĆ¹c caĆ”u truĆ¹c phĆ¶Ć¹c taĆÆp baĆØng caĆ¹c giaĆ»i thuaƤt ƱeƤ qui . MoƤt caĆ”u truĆ¹c dƶƵ lieƤu coĆ¹ tĆ­nh ƱeƤ quy thƶƓĆøng goĆ m moƤt soĆ” thaĆønh phaĆ n dƶƵ lieƤu cuĆøng kieĆ„u ƱƶƓĆÆc gheĆ¹p noĆ”i theo cuĆøng moƤt phƶƓng thĆ¶Ć¹c . VĆ­ duĆÆ 1: MoĆ¢ taĆ» ƱeƤ quy caĆ¢y nhi phaĆ¢n : CaĆ¢y nhi phaĆ¢n kieĆ„u T : + HoaĆ«c laĆø moƤt caĆ”u truĆ¹c roĆ£ng (phaĆ n neo). + HoaĆ«c laĆø moƤt nuĆ¹t kieĆ„u T (nuĆ¹t goĆ”c) vaĆø 2 caĆ¢y nhĆ² phaĆ¢n kieĆ„u T rĆ“Ćøi nhau (caĆ¢y con nhĆ² phaĆ¢n phaĆ»i, caĆ¢y con nhĆ² phaĆ¢n traĆ¹i) keĆ”t hĆ“ĆÆp vĆ“Ć¹i nhau . VĆ­ duĆÆ 2: MoĆ¢ taĆ» ƱeƤ quy maĆ»ng nhieĆ u chieĆ u : + MaĆ»ng moƤt chieĆ u laĆø daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ caĆ¹c thaĆønh phaĆ n cuĆøng kieĆ„u . + MaĆ»ng n chieĆ u laĆø maĆ»ng 1 chieĆ u maĆø caĆ¹c thaĆønh phaĆ n coĆ¹ kieĆ„u maĆ»ng n-1 chieĆ u . III. MOƂ TAƛ ƑEƄ QUY GIAƛI THUAƄT 1. GiaĆ»i thuaƤt ƱeƤ quy. GiaĆ»i thuaƤt ƱeƤ quy laĆø giaĆ»i thuaƤt coĆ¹ chĆ¶Ć¹a thao taĆ¹c goĆÆi ƱeĆ”n noĆ¹ . GiaĆ»i thuaƤt ƱeƤ quy cho pheĆ¹p moĆ¢ taĆ» moƤt daƵy lĆ“Ć¹n caĆ¹c thao taĆ¹c baĆØng moƤt soĆ” Ć­t caĆ¹c thao taĆ¹c trong ƱoĆ¹ coĆ¹ chĆ¶Ć¹a thao taĆ¹c goĆÆi laĆÆi giaĆ»i thuaƤt (goĆÆi ƱeƤ quy) . MoƤt caĆ¹ch toĆ„ng quaĆ¹t moƤt giaĆ»i thuaƤt ƱeƤ quy ƱƶƓĆÆc bieĆ„u dieĆ£n nhƶ moƤt boƤ P goĆ m meƤnh ƱeĆ  S (khoĆ¢ng chĆ¶Ć¹a yeĆ”u toĆ” ƱeƤ quy ) vaĆø P : P ā‰” P[ S , P ] . ThƶĆÆc thi giaĆ»i thuaƤt ƱeƤ quy coĆ¹ theĆ„ daĆ£n tĆ“Ć¹i moƤt tieĆ”n trƬnh goĆÆi ƱeĆ¢ quy khoĆ¢ng keĆ”t thuĆ¹c khi noĆ¹ khoĆ¢ng coĆ¹ khaĆ» naĆŖng gaĆ«p trƶƓĆøng hĆ“ĆÆp neo, vƬ vaƤy quan taĆ¢m ƱeĆ”n ƱieĆ u kieƤn dƶĆøng cuĆ»a moƤt giaĆ»i thuaƤt ƱeƤ quy luoĆ¢n ƱƶƓĆÆc ƱaĆ«t ra . ƑeĆ„ kieĆ„m soaĆ¹t quĆ¹a trƬnh goĆÆi ƱeƤ quy cuĆ»a giaĆ»i thuaƤt ƱeƤ quy P ngƶƓĆøi ta thƶƓĆøng gaĆ©n thao taĆ¹c goĆÆi P vĆ“Ć¹i vieƤc kieĆ„m tra moƤt ƱieĆ u kieƤn B xaĆ¹c Ć±Ć²nh vaĆø bieĆ”n ƱoĆ„i qua moĆ£i laĆ n goĆÆi P , quĆ¹a trƬnh goĆÆi P seĆ» dƶĆøng khi B khoĆ¢ng con thoĆ»a. MoĆ¢ hƬnh toĆ„ng quaĆ¹t cuĆ»a moƤt giaĆ»i thuaƤt ƱeƤ quy vĆ“Ć¹i sƶĆÆ quan taĆ¢m ƱeĆ”n sƶĆÆ dƶĆøng seĆ» laĆø : P if B then P[ S , P ]ā‰” hoaĆ«c P P[ S , if B then P ]ā‰” ThoĆ¢ng thƶƓĆøng vĆ“Ć¹i giaĆ»i thuaƤt ƱeƤ quy P , ƱeĆ„ ƱaĆ»m baĆ»o P seĆ» dƶĆøng sau n laĆ n goĆÆi ta choĆÆn B laĆø ( n >0 ) . MoĆ¢ hƬnh giaĆ»i thuaƤt ƱeƤ quy khi ƱoĆ¹ coĆ¹ daĆÆng : P(n) If ( n > 0 ) then P[ S , P(n - 1)] ;ā‰” hoaĆ«c P(n) P[ S , if (n >0) then P(n - 1) ] ;ā‰” TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 8. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 8 - Trong caĆ¹c Ć¶Ć¹ng duĆÆng thƶĆÆc teĆ” soĆ” laĆ n goĆÆi ƱeƤ quy (ƱoƤ saĆ¢u ƱeƤ quy) khoĆ¢ng nhƶƵng phaĆ»i hƶƵu haĆÆn maĆø coĆøn phaĆ»i ƱuĆ» nhoĆ» . BĆ“Ć»i vƬ moĆ£i laĆ n goĆÆi ƱeƤ quy seƵ caĆ n moƤt vuĆøng nhĆ“Ć¹ mĆ“Ć¹i trong khi vuĆøng nhĆ“Ć¹ cuƵ vaĆ£n phaĆ»i duy trƬ . 2. ChƶƓng trƬnh con ƱeƤ quy. a) CaĆ¹c haĆøm ƱeƤ quy. Ć‘Ć²nh nghĆ³a haĆøm soĆ” baĆØng ƱeƤ quy thƶƓĆøng gaĆ«p trong toaĆ¹n hoĆÆc, ƱieĆ„n hƬnh laĆø caĆ¹c haĆøm nguyeĆ¢n moĆ¢ taĆ» caĆ¹c daƵy soĆ” hoĆ i quy . VĆ­ duĆÆ 1 . DaƵy caĆ¹c giai thƶĆøa : { n! } ā‰” 1 ,1 , 2 , 6 , 24 , 120 , 720 , 5040 , . . . KyĆ¹ hieƤu FAC(n ) = n ! . Ta coĆ¹ : + FAC(0 ) = 1 ; ( 0 ! = 1 ) + FAC(n ) = n * FAC(n - 1 ) ; ( n ! = n * (n - 1 ) ! ) vĆ“Ć¹i n >= 1 GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh FAC(n ) laĆø : FAC(n ) if (n = 0 ) then return 1 ;ā‰” else return (n * FAC(n - 1 )) ; VĆ­ duĆÆ 2 . DaƵy soĆ” Fibonaci(FIBO) : { FIBO (n) } ā‰” 1 ,1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , . . . + FIBO(0 ) = FIBO (1 ) = 1 ; + FIBO(n ) = FIBO (n - 1 ) + FIBO ( n - 2 ) ; vĆ“Ć¹i n > = 2 GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh FIBO ( n ) laĆø : FIBO(n) if ((n = 0 ) or ( n = 1 )) then return 1 ;ā‰” else return ( FIBO (n - 1) + FIBO (n - 2)) ; VĆ­ duĆÆ 3 . DaƵy caĆ¹c toĆ„ hĆ“ĆÆp : 1 1 2 1 1 3 3 1 1 4 6 4 1 C = 1 vĆ“Ć¹i n > = 0n 0 = 0 vĆ“Ć¹i m > n > 0Cn m vĆ“Ć¹i n > m > 0C C Cn m n m n m = +āˆ’ āˆ’ āˆ’1 1 1 GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh laĆø :Cn m if ( m = 0 ) then return 1 ; else if (m > n ) then return 0 ; else return ( ) ;C Cn m n m āˆ’ āˆ’ āˆ’+1 1 1 NhaƤn xeĆ¹t : MoƤt Ć±Ć²nh nghĆ³a haĆøm ƱeƤ quy goĆ m : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 9. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 9 - + MoƤt soĆ” caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n maĆø gĆ­a trĆ² haĆøm taĆÆi ƱoĆ¹ ƱaƵ ƱƶƓĆÆc bieĆ”t trĆ¶Ć“Ć¹c hoaĆ«c coĆ¹ theĆ„ tĆ­nh moƤt caĆ¹ch ƱƓn giaĆ»n (khoĆ¢ng ƱeƤ quy ) . Nhƶ : FAC(0 ) = 1 , FIBO(0) = FIBO(1) = 1 , = 1 , = 0 vĆ“Ć¹i m > n > 0 .Cn 0 Cn m + TrƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t vieƤc tĆ­nh haĆøm seĆ» ƱƶƓc Ʊƶa veĆ  tĆ­nh haĆøm Ć“Ć» giaĆ¹ trĆ² ā€œ beĆ¹ hĆ“nā€ (gaĆ n vĆ“Ć¹i giaĆ¹ trĆ² neo) cuĆ»a ƱoĆ”i soĆ” . Nhƶ : FAC(n ) = n * FAC(n - 1 ) ; FIBO(n) = FIBO(n -1) + FIBO( n - 2 ) . Trong taƤp bieĆ”n cuĆ»a haĆøm coĆ¹ moƤt nhoĆ¹m maĆø ƱoƤ lĆ“Ć¹n cuĆ»a noĆ¹ quyeĆ”t Ć±Ć²nh ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a vieƤc tĆ­nh gĆ­a trĆ² haĆøm . NhoĆ¹m bieĆ”n ƱoĆ¹ goĆÆi laĆø nhoĆ¹m bieĆ”n ƱieĆ u khieĆ„n . GĆ­a trĆ² bieĆ¢n cuĆ»a nhoĆ¹m bieĆ”n ƱieĆ u khieĆ„n Ć¶Ć¹ng vĆ“Ć¹i trƶƓĆøng hĆ“ĆÆp suy bieĆ”n . GĆ­a trĆ² cuĆ»a nhoĆ¹m bieĆ”n ƱieĆ u khieĆ„n seĆ» thay ƱoĆ„i qua moĆ£i laĆ n goĆÆi ƱeƤ quy vĆ“Ć¹i xu hĆ¶Ć“Ć¹ng tieĆ”n ƱeĆ”n gĆ­a trĆ² bieĆ¢n ( tƶƓng Ć¶Ć¹ng vĆ“Ć¹i caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n cuĆ»a haĆøm ). b) CaĆ¹c thuĆ» tuĆÆc ƱeƤ quy. ThuĆ» tuĆÆc ƱeƤ quy laĆø thuĆ» tuĆÆc coĆ¹ chĆ¶Ć¹a leƤnh goĆÆi ƱeĆ”n noĆ¹ . ThuĆ» tuĆÆc ƱeƤ quy thƶƓĆøng ƱƶƓĆÆc sƶƻ duĆÆng ƱeĆ„ moĆ¢ taĆ» caĆ¹c thao taĆ¹c treĆ¢n caĆ”u truĆ¹c dƶƵ lieƤu coĆ¹ tĆ­nh ƱeƤ quy VĆ­ duĆÆ 1 : Xem daƵy n phaĆ n tƶƻ a[1:n] laĆø sƶĆÆ keĆ”t hĆ“ĆÆp giƶƵa daƵy a[1:n-1] vaĆø a[n] . Do Ʊo Ć¹: - ThuĆ» tuĆÆc tƬm max trong daƵy a[1:n] ( thuĆ» tuĆÆc TMax) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt ƱeƤ qui : + TƬm max trong daƵy con a[1:n] (goĆÆi ƱeƤ quy Tmax(a[1:n-1] ) ). + TƬm max cuĆ»a 2 soĆ” : Tmax(a[1:n-1]) vaĆø a[n] (giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy). TĆ¶Ć¹c laĆø : TMax(a[1:n]) = max(TMax(a[1:n-l]) , a[n] ) vĆ“Ć¹i TMax(a[m:m] = a[m] ; ( trƶƓĆøng hĆ“ĆÆp neo ) max(x,y) = x > y ? x : y ; ( giaĆ»i thuaƤt tĆ­nh max 2 soĆ” : if (x>y) then max(x ,y) = x else max(x ,y) = y ) - ThuĆ» tuĆÆc tĆ­nh toĆ„ng caĆ¹c phaĆ n tƶƻ ( thuĆ» tuĆÆc TSUM ) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt ƱeƤ quy : + TƬm toĆ„ng daƵy con a[1:n] (goĆÆi ƱeƤ quy TSUM(a[1:n-1]) ). + TƬm toĆ„ng cuĆ»a 2 soĆ” : TSUM(a[1:n-1]) vaĆø a[n] (giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy). TĆ¶Ć¹c laĆø : TSUM(a[1:n]) = a[n] + TSUM(a[1:n-1] vĆ“Ć¹i TSUM(a[m:m]) = a[m] VĆ­ duĆÆ 2 : Xem daƵy a[m : n] laĆø sƶĆÆ keĆ”t noĆ”i giƶƵa hai daƵy: daƵy a[m:((m+n) div 2)] vaĆø daƵy a[(((m+n) div 2)+1) :n] . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 10. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 10 - Do Ʊo Ć¹: - ThuĆ» tuĆÆc tƬm max trong daƵy a[1:n] ( thuĆ» tuĆÆc Tmax1) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt ƱeƤ qui : + TƬm max trong daƵy con traĆ¹i a[m:((m+n) div 2)] (goĆÆi ƱeƤ quy Tmax1(a[m:((m+n) div 2)] ) ). + TƬm max trong daƵy con phaĆ»i a[(((m+n) div 2)+1) :n] . (goĆÆi ƱeƤ quy Tmax1(a[(((m+n) div 2)+1) :n] ). + TƬm max cuĆ»a 2 soĆ” : Tmax1(a[m:((m+n) div 2)] ) vaĆø Tmax1(a[(((m+n) div 2)+1) :n] ). (giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy). TĆ¶Ć¹c laĆø :Tmax1(a[m:n]) = max(Tmax1(a[m:((m+n) div 2)] ) ,Tmax1(a[(((m+n) div 2)+1) :n]) ). vĆ“Ć¹i Tmax1(a[m:m] = a[m] ; ( trƶƓĆøng hĆ“ĆÆp neo ) max(x,y) = x > y ? x : y ; - ThuĆ» tuĆÆc tĆ­nh toĆ„ng caĆ¹c phaĆ n tƶƻ ( TSUM1 ) coĆ¹ theĆ„ thƶĆÆc hieƤn theo luaƤt ƱeƤ quy : + TƬm toĆ„ng daƵy con traĆ¹i a[m:((m+n) div 2)] (goĆÆi ƱeƤ quy TSUM1 (a[m:((m+n) div 2)] ) ). + TƬm toĆ„ng daƵy con phaĆ»i a[(((m+n) div 2)+1) :n] . (goĆÆi ƱeƤ quy TSUM1 (a[(((m+n) div 2)+1) :n] ) ). + TƬm toĆ„ng cuĆ»a 2 soĆ” : TSUM1 (a[m:((m+n) div 2)] ) vaĆø TSUM1 (a[(((m+n) div 2)+1) :n] ). TĆ¶Ć¹c laĆø : TSUM1 (a[m:n]) = TSUM1 (a[m:((m+n) div 2)]) + TSUM1 (a[(((m+n) div 2)+1) :n] ) vĆ“Ć¹i TSUM1 (a[m:m]) = a[m] VĆ­ duĆÆ 3 : CaĆ¢y nhĆ² phaĆ¢n tƬm kieĆ”m kieĆ„u T(BST) laĆø moƤt caĆ”u truĆ¹c goĆ m : moƤt nuĆ¹t kieĆ„u T keĆ”t noĆ”i vĆ“Ć¹i 2 caĆ¢y con nhi phaĆ¢n tƬm kieĆ”m kieĆ„u T neĆ¢n : - ThuĆÆ tuĆÆc queĆ¹t caĆ¢y nhi nhaĆ¢n tƬm kieĆ”m theo thĆ¶Ć¹ tƶĆÆ giƶƵa (LNF) laĆø : + QueĆ¹t caĆ¢y con traĆ¹i theo thĆ¶Ć¹ tƶĆÆ giƶƵa ; + ThaĆŖm nuĆ¹t goĆ”c ; + QueĆ¹t caĆ¢y con phaĆ»i theo thĆ¶Ć¹ tƶĆÆ giƶƵa ; - ThuĆ» tuĆÆc tƬm kieĆ”m giaĆ¹ tri Ī±o treĆ¢n caĆ¢y nhĆ² phaĆ¢n tƬm kieĆ”m Root laĆø : NeĆ”u Root ā‰” āˆ… thƬ thƶĆÆc hieƤn thao taĆ¹c roĆ£ng (khoĆ¢ng laĆøm gƬ ) Con khoĆ¢ng neĆ”u giaĆ¹ trĆ² taĆÆi nuĆ¹t goĆ”c = Ī±o thƬ thoĆ¢ng baĆ¹o tƬm thaĆ”y vaĆø dƶĆøng CoĆøn khoĆ¢ng neĆ”u giaĆ¹ trĆ² taĆÆi nuĆ¹t goĆ”c < Ī±o thƬ tƬm Ć“Ć» caĆ¢y con traĆ¹i CoĆøn khoĆ¢ng thƬ tƬm Ć“Ć» caĆ¢y con phaĆ»i . NhaƤn xeĆ¹t : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 11. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 11 - Trong moƤt thuĆ» tuĆÆc ƱeƤ qui, ƱeĆ„ cho vieƤc goĆÆi ƱeƤ quy dƶĆøng laĆÆi sau hƶƵu haĆÆn laĆ n goĆÆi noĆ¹ caĆ n chĆ¶Ć¹a ƱieĆ u kieƤn kieĆ„m tra (moƤt bieĆ„u thĆ¶Ć¹c boolean B treĆ¢n moƤt nhoĆ¹m bieĆ”n ) , ƱeĆ„ khi ƱieĆ u kieƤn naĆøy khoĆ¢ng coĆøn thoĆ»a thƬ vieƤc goĆÆi ƱeƤ qui keĆ”t thuĆ¹c . DaĆÆng thƶƓĆøng gaĆ«p cuĆ»a thuĆ» tuĆÆc ƱeƤ qui laĆø : S1 ; ( khoĆ¢ng chĆ¶Ć¹a yeĆ”u toĆ” ƱeƤ qui ) if B then S2 ( phaĆ n leƤnh trƶĆÆc tieĆ”p , khoĆ¢ng coĆ¹ leƤnh goĆÆi ƱeƤ qui ) else Sdq ; ( phaĆ n leƤnh coĆ¹ leƤnh goĆÆi ƱeƤ qui ) S3 ; (khoĆ¢ng coĆ¹ goĆÆi ƱeƤ qui ) 3. MaƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ qui trong caĆ¹c ngoĆ¢n ngƶƵ laƤp trƬnh. a) ToĆ„ng quan. KhoĆ¢ng phaĆ»i moĆÆi ngoĆ¢n ngƶƵ laƤp trƬnh hieƤn coĆ¹ ƱeĆ u coĆ¹ theĆ„ maƵ hoĆ¹a ƱƶƓĆÆc giaĆ»i thuaƤt ƱeƤ quy, chƦ moƤt soĆ” nhƶƵng ngoĆ¢n ngƶƵ laƤp trƬnh coĆ¹ khaĆ» naĆŖng toĆ„ chĆ¶Ć¹c vuĆøng nhĆ“Ć¹ kieĆ„u stack mĆ“Ć¹i coĆ¹ khaĆ» naĆŖng maƵ hoĆ¹a ƱƶƓĆÆc giaĆ»i thuaƤt ƱeƤ quy . CaĆ¹c ngoĆ¢n ngƶƵ laƤp trƬnh hieƤn nay ƱeĆ u maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy baĆØng caĆ¹ch toĆ„ chĆ¶Ć¹c caĆ¹c chƶƓng trƬnh con ƱeƤ quy tƶƓng Ć¶Ć¹ng . b) TheĆ„ hieƤn ƱeƤ qui trong NNLT PASCAL vaĆø C++ NN LT Pascal vaĆø C++ ƱeĆ u cho pheĆ¹p maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy baĆØng caĆ¹ch toĆ„ chĆ¶Ć¹c chƶƓng trƬnh con ƱeĆ¢ quy nhĆ“Ćø vaĆøo cĆ“ cheĆ” taĆÆo vuĆøng nhĆ“Ć¹ Stak cuĆ»a phaĆ n meĆ m ngoĆ¢n ngƶƵ . b1) Trong NNLT C++. NNLT C++ cho pheĆ¹p maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy moƤt caĆ¹ch thuaƤn lĆ“ĆÆi nhĆ“Ćø vaĆøo kyƵ thuaƤt khai baĆ¹o trĆ¶Ć“Ć¹c tieĆ¢u ƱeĆ  neĆ¢n khoĆ¢ng coĆ¹ sƶĆÆ phaĆ¢n bieƤt hƬnh thĆ¶Ć¹c naĆøo trong vieƤc khai baĆ¹o giƶƵa haĆøm con ƱeƤ quy vaĆø haĆøm con khoĆ¢ng ƱeƤ quy. b2) Trong NN LT Pascal . ƑoĆ”i vĆ“Ć¹i chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p thƬ hƬnh thĆ¶Ć¹c khai baĆ¹o cuƵng gioĆ”ng nhƶ ƱoĆ”i vĆ“Ć¹i chƶƓng trƬnh con khoĆ¢ng ƱeƤ quy. ƑoĆ”i vĆ“Ć¹i chƶƓng trƬnh con ƱeƤ quy giaĆ¹n tieĆ”p thƬ hƬnh thĆ¶Ć¹c khai baĆ¹o coĆ¹ thay ƱoĆ„i Ć­t nhieĆ u nhaĆØm thoĆ»a quy taĆ©c taĆ m vƶĆÆc cuĆ»a ngoĆ¢n ngƶƵ ( trong phaĆ n leƤnh cuĆ»a moƤt chƶƓng trƬnh con chƦ ƱƶƓĆÆc goĆÆi nhƶƵng chƶƓng trƬnh con cuĆøng caĆ”p ƱaƵ ƱƶƓĆÆc khai baĆ¹o trĆ¶Ć“Ć¹c ). VĆ­ duĆÆ : VĆ“Ć¹i moĆ¢ hƬnh chƶƓng trƬnh sau : Trong phaĆ n leƤnh cuĆ»a khoĆ”i A coĆ¹ theĆ„ goĆÆi ƱeĆ”n : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 12. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 12 - + GoĆÆi caĆ¹c chƶƓng trƬnh con trƶĆÆc tieĆ”p cuĆ»a noĆ¹ goĆÆi ƱƶƓĆÆc B nhƶng khoĆ¢ng goĆÆi ƱƶƓĆÆc C + GoĆÆi chĆ­nh noĆ¹ ( goĆÆi ƱeƤ quy ). + GoĆÆi chƶƓng trƬnh con cuĆøng caĆ”p nhƶmg phaĆ»i khai baĆ¹o trĆ¶Ć“Ć¹c goĆÆi ƱƶƓĆÆc E nhƶng khoĆ¢ng goĆÆi ƱƶƓĆÆc D , MuoĆ”n goĆÆi D phaĆ»i khai baĆ¹o trĆ¶Ć“Ć¹c ( khai baĆ¹o FORWARD) Khai baĆ¹o trĆ¶Ć“Ć¹c FORWARD . D A B C Program E ƑeĆ„ tƶĆø thuĆ» tuĆÆc haĆøm A coĆ¹ theĆ„ goĆÆi ƱeĆ”n D laĆø thuĆ» tuĆÆc haĆøm cuĆøng caĆ”p nhƶng ƱƶƓĆÆc moĆ¢ taĆ» sau A, ta caĆ n coĆ¹ moƤt khai baĆ¹o trĆ¶Ć“Ć¹c cuĆ»a D Ć“Ć» phĆ­a trĆ¶Ć“Ć¹c cuĆ»a A . Khai baĆ¹o naĆøy goĆ m : tieĆ¢u ƱeĆ  cuĆ»a D, vĆ“Ć¹i danh saĆ¹ch thoĆ¢ng soĆ” cuĆ»a D, tieĆ”p theo laĆø tƶĆø khoaĆ¹ FORWARD . Sau ƱoĆ¹ luĆ¹c moĆ¢ taĆ» laĆÆi D thƬ chƦ caĆ n khai baĆ¹o tƶĆø khoaĆ¹ PROCEDURE ( hoaĆ«c FUNCTION ) , teĆ¢n cuĆ»a D ( khoĆ¢ng coĆ¹ danh saĆ¹ch thoĆ¢ng soĆ” ) , phaĆ n thaĆ¢n cuĆ»a D. VĆ­ duĆÆ : VĆ“Ć¹i 2 thuĆ» tuĆÆc goĆÆi ƱeƤ quy hoĆ£ tƶƓng nhau FIRST,SECOND seƵ ƱƶƓĆÆc khai baĆ¹o nhƶ sau : procedure SECOND (i : integer ) ; Forward ; procedure FIRST (n : integer ; var X : real); var j, k : interger ; begin for j := 1 to n do begin writeln(ā€˜ j = ā€˜, j ) ; k := n ā€“ 2* j ; SECOND( k ); end ; end ; procedure second ; begin if ( i > 0 ) then begin writeln(ā€˜ i= ā€˜, i ); FIRST( i ā€“ 1 ) ; end ; end ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 13. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 13 - 4. MoƤt soĆ” daĆÆng giaĆ»i thuaƤt ƱeƤ quy ƱƓn giaĆ»n thƶƓĆøng gaĆ«p . a) ƑeƤ quy tuyeĆ”n tĆ­nh. ChƶƓng trƬnh con ƱeƤ quy tuyeĆ”n tĆ­nh laĆø chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p ƱƓn giaĆ»n nhaĆ”t coĆ¹ daĆÆng : P ā‰” { NEƁU thoĆ»a ƱieĆ u kieƤn dƶĆøng thƬ thƶĆÆc hieƤn S ; CoĆøn khoĆ¢ng begin { thƶĆÆc hieƤn S* ; goĆÆi P } } VĆ“Ć¹i S , S* laĆø caĆ¹c thao taĆ¹c khoĆ¢ng ƱeƤ quy . VĆ­ duĆÆ 1 : HaĆøm FAC(n) tĆ­nh soĆ” haĆÆng n cuĆ»a daƵy n! + DaĆÆng haĆøm trong ngoĆ¢n ngƶƵ maƵ giaĆ» : { NeĆ”u n = 0 thƬ FAC = 1 ; /* trƶƓĆøng hĆ“ĆÆp neo */ CoĆøn khoĆ¢ng FAC = n*FAC(n-1) } + DaĆÆng haĆøm trong ngoĆ¢n ngƶƵ Pascal : Function FAC(n : integer) : integer; begin if( n = 0 ) then FAC := 1 else FAC := n*FAC(n-1) ; end; + DaĆÆng haĆøm trong C++ : int FAC( int n ) { if ( n == 0 ) return 1 ; else return ( n * FAC(n-1 )) ; } VĆ­ duĆÆ 2 : ChƶƓng trƬnh con tĆ­nh USCLN cuĆ»a 2 soĆ” dƶĆÆa vaĆøo thuaƤt toaĆ¹n Euclide : + DaĆÆng haĆøm treĆ¢n ngoĆ¢n ngƶƵ toaĆ¹n hoĆÆc : USCLN(m , n ) = USCLN(n , m mod n ) khi n ā‰  0 USCLN(m , 0) = m + DaĆÆng haĆøm trong ngoĆ¢n ngƶƵ maƵ giaĆ» : NeĆ”u n = 0 thƬ USCLN = m CoĆøn khoĆ¢ng USCLN = USCLN( n , m mod n ) ; + DaĆÆng haĆøm trong Pascal : Function USCLN(m , n : integer ) : integer ; begin if (n = 0 ) then USCLN := m else USCLN := USCLN( n , m mod n ) ; end ; +DaĆÆng haĆøm trong C++ : int USCLN( int m , int n ) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 14. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 14 - { if(n == 0 ) return (m) ; else return ( USCLN( n , m mod n)) ; } b) ƑeƤ quy nhĆ² phaĆ¢n. ChƶƓng trƬnh con ƱeƤ quy nhĆ² phaĆ¢n laĆø chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p coĆ¹ daĆÆng : P ā‰” { NEƁU thoĆ»a ƱieĆ u kieƤn dƶĆøng thƬ thƶĆÆc hieƤn S ; CoĆøn khoĆ¢ng begin { thƶĆÆc hieƤn S* ; goĆÆi P ; goĆÆi P } } VĆ“Ć¹i S , S* laĆø caĆ¹c thao taĆ¹c khoĆ¢ng ƱeƤ quy . VĆ­ duĆÆ 1 : HaĆøm FIBO(n) tĆ­nh soĆ” haĆÆng n cuĆ»a daƵy FIBONACCI + DaĆÆng haĆøm trong Pascal: Function F(n : integer) : integer; begin if( n < 2 ) then F := 1 else F := F(n-1) + F(n-2) end; + DaĆÆng haĆøm trong C++ : int F(int n) { if ( n < 2 ) return 1 ; else return (F(n -1) + F(n -2)) ; } c) ƑeƤ quy phi tuyeĆ”n. ChƶƓng trƬnh con ƱeƤ quy phi tuyeĆ”n laĆø chƶƓng trƬnh con ƱeƤ quy trƶĆÆc tieĆ”p maĆø lĆ“Ćøi goĆÆi ƱeƤ quy ƱƶƓĆÆc thƶĆÆc hieƤn beĆ¢n trong voĆøng laĆ«p . DaĆÆng toĆ„ng quaĆ¹t cuĆ»a chƶƓng trƬnh con ƱeƤ quy phi tuyeĆ”n laĆø : P ā‰” { for giaĆ¹ tri ƱaĆ u to giaĆ¹ trĆ² cuoĆ”i do begin thƶĆÆc hieƤn S ; if ( thoĆ»a ƱieĆ u kieƤn dƶĆøng ) then thƶĆÆc hieƤn S* else goĆÆi P end ; } VĆ“Ć¹i S , S* laĆø caĆ¹c thao taĆ¹c khoĆ¢ng ƱeƤ quy . VĆ­ duĆÆ : Cho daƵy { Xn } xaĆ¹c Ć±Ć²nh theo coĆ¢ng thĆ¶Ć¹c truy hoĆ i : X0 = 1 ; Xn = n2 XO +(n-1)2 X1 + . . . + 2 2 Xn-2 + 1 2 Xn-1 + DaĆÆng haĆøm ƱeƤ quy tĆ­nh Xn treĆ¢n ngoĆ¢n ngƶƵ maƵ giaĆ» laĆø : Xn ā‰” if ( n= 0 ) then return 1 ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 15. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 15 - else { tg = 0 ; for i = 0 to n-1 do tg = tg + (n-i)2 Xi ; return tg ; } + DaĆÆng haĆøm ƱeƤ quy tĆ­nh Xn treĆ¢n ngoĆ¢n ngƶƵ Pascal laĆø : function X( n :integer) : integer ; var i , tg : integer ; begin if ( n= 0 ) then X := 1 else begin tg = 0 ; for i: = 0 to n-1 do tg : = tg + sqr(n-i) *X(i) ; X := tg ; end ; end ; + DaĆÆng haĆøm ƱeƤ quy tĆ­nh Xn treĆ¢n ngoĆ¢n ngƶƵ C++ laĆø : int X( int n ) ; { if ( n == 0 ) return 1 ; else { int tg = 0 ; for (int i = 0 ; i<n ; i++ ) tg = tg + sqr(n-i) *X(i); return ( tg ) ; } TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 16. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 16 - CHƖƔNG II BAƘI TOAƙN ƑEƄ QUY I. CAƙC NOƄI DUNG CAƀN LAƘM ƑEƅ TƌM GIAƛI THUAƄT ƑEƄ QUY CHO MOƄT BAƘI TOAƙN. ƑeĆ„ xaĆ¢y dƶĆÆng giaĆ»i thuaƤt giaĆ»i moƤt baĆøi toaĆ¹n coĆ¹ tĆ­nh ƱeƤ quy baĆØng phƶƓng phaĆ¹p ƱeƤ quy ta caĆ n thƶĆÆc hieƤn tuaĆ n tƶĆÆ 3 noƤi dung sau : - ThoĆ¢ng soĆ” hoĆ¹a baĆøi toaĆ¹n . - TƬm caĆ¹c trƶƓĆøng hĆ“ĆÆp neo cuĆøng giaĆ»i thuaƤt giaĆ»i tƶƓng Ć¶Ć¹ng . - TƬm giaĆ»i thuaƤt giaĆ»i trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t baĆØng phaĆ¢n raƵ baĆøi toaĆ¹n theo kieĆ„u ƱeƤ quy. 1. ThoĆ¢ng soĆ” hoaĆ¹ baĆøi toaĆ¹n. ToĆ„ng quaĆ¹t hoĆ¹a baĆøi toaĆ¹n cuĆÆ theĆ„ caĆ n giaĆ»i thaĆønh baĆøi toaĆ¹n toĆ„ng quaĆ¹t (moƤt hoĆÆ caĆ¹c baĆøi toaĆ¹n chĆ¶Ć¹a baĆøi toaĆ¹n caĆ n giaĆ»i ),tƬm ra caĆ¹c thoĆ¢ng soĆ” cho baĆøi toaĆ¹n toĆ„ng quaĆ¹t ƱaĆ«c bieƤt laĆø nhoĆ¹m caĆ¹c thoĆ¢ng soĆ” bieĆ„u thĆ² kĆ­ch thĆ¶Ć“Ć¹c cuĆ»a baĆøi toaĆ¹n ā€“ caĆ¹c thoĆ¢ng soĆ” ƱieĆ u khieĆ„n ( caĆ¹c thoĆ¢ng soĆ” maĆø ƱoƤ lĆ“Ć¹n cuĆ»a chuĆ¹ng ƱaĆ«c trƶng cho ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a baĆøi toaĆ¹n , vaĆø giaĆ»m Ʊi qua moĆ£i laĆ n goĆÆi ƱeƤ qui ) . VĆ­ duĆÆ : n trong haĆøm FAC(n) ; a , b trong haĆøm USCLN(a,b) . 2. PhaĆ¹t hieƤn caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n (neo) vaĆø tƬm giaĆ»i thuaƤt cho caĆ¹c trƶƓĆøng hĆ“ĆÆp naĆøy. ƑaĆ¢y laĆø caĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n cuĆ»a baĆøi toaĆ¹n toĆ„ng quaĆ¹t , laĆø caĆ¹c trƶƓng hĆ“ĆÆp tƶƓng Ć¶Ć¹ng vĆ“Ć¹i caĆ¹c gĆ­a trĆ² bieĆ¢n cuĆ»a caĆ¹c bieĆ”n ƱieĆ u khieĆ„n (trƶƓĆøng hĆ“ĆÆp kĆ­ch thĆ¶Ć“Ć¹c baĆøi toaĆ¹n nhoĆ» nhaĆ”t), maĆø giaĆ»i thuaƤt giaĆ»i khoĆ¢ng ƱeƤ qui (thƶƓĆøng raĆ”t ƱƓn giaĆ»n). VĆ­ duĆÆ : FAC(1) =1 , USCLN(a,0) = a , SM(a[x:x] ā‰”āˆ… ,TSUM(a[m:m]) = a[m] 3. PhaĆ¢n raƵ baĆøi toaĆ¹n toĆ„ng quaĆ¹t theo phƶƓng thĆ¶Ć¹c ƱeƤ quy. TƬm phƶƓng aĆ¹n (giaĆ»i thuaƤt ) giaĆ»i baĆøi toaĆ¹n trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t baĆØng caĆ¹ch phaĆ¢n chia noĆ¹ thaĆønh caĆ¹c thaĆønh phaĆ n maĆø hoaĆ«c coĆ¹ giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy hoaĆ«c laĆø baĆøi toaĆ¹n treĆ¢n nhƶng coĆ¹ kĆ­ch thĆ¶Ć“Ć¹c nhoĆ» hĆ“n. VĆ­ duĆÆ : FAC(n) = n * FAC(n -1) . Tmax(a[1:n]) = max(Tmax(a[1:(n-1)]) , a[n] ) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 17. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 17 - II. MOƄT SOƁ BAƘI TOAƙN GIAƛI BAƈNG GIAƛI THUAƄT ƑEƄ QUY ƑIEƅN HƌNH. 1. BaĆøi toaĆ¹n thaĆ¹p HaĆø NoƤi . TruyeĆ n thuyeĆ”t keĆ„ raĆØng : MoƤt nhaĆø toaĆ¹n hoĆÆc PhaĆ¹p sang thaĆŖm ƑoĆ¢ng DƶƓng ƱeĆ”n moƤt ngoĆ¢i chuĆøa coĆ„ Ć“Ć» HaĆø NoƤi thaĆ”y caĆ¹c vĆ² sƶ Ʊang chuyeĆ„n moƤt choĆ ng Ć±Ć³a quĆ¹y goĆ m 64 Ć±Ć³a vĆ“Ć¹i kĆ­ch thĆ¶Ć“Ć¹c khaĆ¹c nhau tƶĆø coƤt A sang coƤt C theo caĆ¹ch : - MoĆ£i laĆ n chƦ chuyeĆ„n 1 Ć±Ć³a . - Khi chuyeĆ„n coĆ¹ theĆ„ duĆøng coƤt trung gian B . - Trong suoĆ”t quĆ¹a trƬnh chuyeĆ„n caĆ¹c choĆ ng Ć±Ć³a Ć“Ć» caĆ¹c coƤt luoĆ¢n ƱƶƓĆÆc xeĆ”p ƱuĆ¹ng (Ć±Ć³a coĆ¹ kĆ­ch thĆ¶Ć“Ć¹c beĆ¹ ƱƶƓĆÆc ƱaĆ«t treĆ¢n Ć±Ć³a coĆ¹ kĆ­ch thĆ¶Ć“Ć¹c lĆ“Ć¹n ) . Khi ƱƶƓĆÆc hoĆ»i caĆ¹c vĆ² sƶ cho bieĆ”t khi chuyeĆ„n xong choĆ ng Ć±Ć³a thƬ ƱeĆ”n ngaĆøy taƤn theĆ” !. Nhƶ seƵ chƦ ra sau naĆøy vĆ“Ć¹i choĆ ng goĆ m n Ć±Ć³a caĆ n - 1 laĆ n chuyeĆ„n cĆ“ baĆ»n (chuyeĆ„n 1 Ć±Ć³a ). 2n GiaĆ» sƶƻ thĆ“Ćøi gian ƱeĆ„ chuyeĆ„n 1 ƱƦa laĆø t giaĆ¢y thƬ thĆ“Ćøi gian ƱeĆ„ chuyeĆ„n xong choĆ ng 64 Ć±Ć³a seƵ laĆø : T = ( 2 ) * t S = 18164 āˆ’ 4 1019 . * *t S VĆ“Ć¹i t = 1/100 s thƬ T = 5.8*109 naĆŖm = 5.8 tyĆ» naĆŖm . Ta coĆ¹ theĆ„ tƬm thaĆ”y giaĆ»i thuaƤt (daƵy caĆ¹c thao taĆ¹c cĆ“ baĆ»n ) cho baĆøi toaĆ¹n moƤt caĆ¹ch deĆ£ daĆøng Ć¶Ć¹ng vĆ“Ć¹i trƶƓĆøng hĆ“ĆÆp choĆ ng Ć±Ć³a goĆ m 0, 1, 2, 3 Ć±Ć³a . VĆ“Ć¹i choĆ ng 4 Ć±Ć³a giaĆ»i thuaƤt baĆøi toaĆ¹n ƱaƵ trĆ“Ć» neĆ¢n phĆ¶Ć¹c taĆÆp . Tuy nhieĆ¢n giaĆ»i thuaƤt cuĆ»a baĆøi toaĆ¹n laĆÆi ƱƶƓĆÆc tƬm thaĆ”y raĆ”t deĆ£ daĆøng nhanh choĆ¹ng khi ta khaĆ¹i quaĆ¹t soĆ” Ć±Ć³a laĆø n baĆ”t kyĆø vaĆø nhƬn baĆøi toaĆ¹n baĆØng quan nieƤm ƱeƤ quy . a) ThoĆ¢ng soĆ” hoĆ¹a baĆøi toaĆ¹n . XeĆ¹t baĆøi toaĆ¹n Ć“Ć» mĆ¶Ć¹c toĆ„ng quaĆ¹t nhaĆ”t : chuyeĆ„n n (n>=0) Ć±Ć³a tƶĆø coƤt X sang coƤt Z laĆ”y coƤt Y laĆøm trung gian . Ta goĆÆi giaĆ»i thuaƤt giaĆ»i baĆøi toaĆ¹n Ć“Ć» mĆ¶Ć¹c toĆ„ng quaĆ¹t laĆø thuĆ» tuĆÆc THN(n ,X ,Y,Z) chĆ¶Ć¹a 4 thoĆ¢ng soĆ” n,X,Y,Z ; n thuoƤc taƤp soĆ” tƶĆÆ nhieĆ¢n N (kieĆ„u nguyeĆ¢n khoĆ¢ng daĆ”u ); X ,Y,Z thuoƤc taƤp caĆ¹c kyĆ¹ tƶĆÆ (kieĆ„u kyĆ¹ tƶĆÆ ). BaĆøi toaĆ¹n coĆ„ Ć“Ć» treĆ¢n seĆ» ƱƶƓĆÆc thƶĆÆc hieƤn baĆØng lĆ“Ćøi goĆÆi THN(64,A,B,C) . DeĆ£ thaĆ”y raĆØng : trong 4 thoĆ¢ng soĆ” cuĆ»a baĆøi toaĆ¹n thƬ thoĆ¢ng soĆ” n laĆø thoĆ¢ng soĆ” quyeĆ”t Ć±Ć²nh ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a baĆøi toaĆ¹n ( n caĆøng lĆ“Ć¹n thƬ soĆ” thao taĆ¹c chuyeĆ„n ƱƦa caĆøng nhieĆ u vaĆø thĆ¶Ć¹ tƶĆÆ thƶĆÆc hieƤn chuĆ¹ng caĆøng khoĆ¹ hƬnh dung ) , n laĆø thoĆ¢ng soĆ” ƱieĆ u khieĆ„n . b) TrƶƓĆøng hĆ“ĆÆp suy bieĆ”n vaĆø caĆ¹ch giaĆ»i . VĆ“Ć¹i n =1 baĆøi toaĆ¹n toĆ„ng quaĆ¹t suy bieĆ”n thaĆønh baĆøi toaĆ¹n ƱƓn giaĆ»n THN (1,X,Y,Z) : tƬm daƵy thao taĆ¹c ƱeĆ„ chuyeĆ„n choĆ ng 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Z laĆ”y coƤt Y laĆøm trung gian . GiaĆ»i thuaƤt giaĆ»i baĆøi toaĆ¹n THN (1,X,Y,Z) laĆø thƶĆÆc hieƤn chƦ 1 thao taĆ¹c cĆ“ baĆ»n : ChuyeĆ„n 1 Ć±Ć³a tƶĆø X sang Z ( kyĆ¹ hieƤu laĆø Move (X , Z) ) . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 18. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 18 - THN(1,X,Y,Z) ā‰” { Move( X, Z ) } ChuĆ¹ yĆ¹ : HoaĆøn toaĆøn tƶƓng tƶĆÆ ta cuƵng coĆ¹ theĆ„ quan nieƤn trƶƓĆøng hĆ“ĆÆp suy bieĆ”n laĆø trƶƓĆøng hĆ“ĆÆp n= 0 tƶƓng Ć¶Ć¹ng vĆ“Ć¹i baĆøi toaĆ¹n THN(0,X,Y,Z) : chuyeĆ„n 0 Ć±Ć³a tƶĆø X sang Z laĆ”y Y laĆøm trung gian maĆø giaĆ»i thuaƤt tƶƓng Ć¶Ć¹ng laĆø khoĆ¢ng laĆøm gƬ caĆ» ( thƶĆÆc hieƤn thao taĆ¹c roĆ£ng ) . THN(0,X,Y,Z) ā‰” { Ļ† } c) PhaĆ¢n raƵ baĆøi toaĆ¹n : Ta coĆ¹ theĆ„ phaĆ n raƵ baĆøi toaĆ¹n TH N (k,X,Y,Z) : chuyeĆ„n k Ć±Ć³a tƶĆø coƤt X sang coƤt Z laĆ”y coƤt Y laĆøm trung gian thaĆønh daƵy tuaĆ n tƶĆÆ 3 coĆ¢ng vieƤc sau : + ChuyeĆ„n (k -1) Ć±Ć³a tƶĆø coƤt X sang coƤt Y laĆ”y coƤt Z laĆøm trung gian : THN (k -1,X,Z,Y) (baĆøi toaĆ¹n THN vĆ“Ć¹i n = k-1,X= X , Y = Z , Z = Y ) + ChuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Z : Move ( X, Z ) (thao taĆ¹c cĆ“ baĆ»n ). + ChuyeĆ„n (k - 1 ) Ć±Ć³a tƶĆø coƤt Y sang coƤt Z laĆ”y coƤt X laĆøm trung gian : THN( k -1,Y,X,Z) ( baĆøi toaĆ¹n THN vĆ“Ć¹i n = k-1 , X = Y , Y = X , Z = Z ) . VaƤy giaĆ»i thuaƤt trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t (n > 1) laĆø : THN(n,X,Y,Z) ā‰” { THN (n -1,X,Z,Y) ; Move ( X, Z ) ; THN (n -1,Y,X,Z) ; } VĆ“Ć¹i n Ć±Ć³a thƬ caĆ n bao nhieĆ¢u bĆ¶Ć“Ć¹c chuyeĆ„n 1 Ć±Ć³a? ThƶĆÆc chaĆ”t trong thuĆ» tuĆÆc THN caĆ¹c leƤnh goĆÆi ƱeƤ qui chƦ nhaĆØm saĆ©p seĆ”p trƬnh tƶĆÆ caĆ¹c thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a SoĆ” laĆ n chuyeĆ„n 1 Ć±Ć³a ƱƶƓĆÆc thƶĆÆc hieƤn laĆø ƱaĆ«c trƶng cho ƱoƤ phĆ¶Ć¹c taĆÆp cuĆ»a giaĆ»i thuaƤt . VĆ“Ć¹i n Ć±Ć³a , goĆÆi f(n) laĆø soĆ” caĆ¹c thao taĆ¹c chuyeĆ„n _moƤt_Ć±Ć³a . Ta coĆ¹ : f(0) = 0 . f(1) =1 . f(n) = 2f(n -1) + 1 vĆ“Ć¹i n > 0 Do Ʊo Ć¹ : f(n) = 1+ 2 + 2 2 + + 2 n-1 = 2 n - 1 ƑeĆ„ chuyeĆ„n 64 Ć±Ć³a caĆ n 2 64 - 1 bĆ¶Ć“Ć¹c hay xaĆ”p xƦ 10 20 bĆ¶Ć“Ć¹c . CaĆ n khoaĆ»ng 10 trieƤu naĆŖm vĆ“Ć¹i moƤt maĆ¹y tĆ­nh nhanh nhaĆ”t hieƤn nay ƱeĆ„ laĆøm vieƤc naĆøy . d) ChƶƓng trƬnh con maƵ hoĆ¹a giaĆ»i thuaƤt THN trong NNLT Pascal : procedure THN (n : integer ; X,Y,Z : char) begin if n > 0 then begin THN (n-1 ,X,Z,Y) ; Move( X, Z); THN (n-1 ,Y,X,Z); end ; end ; ( LaĆ”y trƶƓĆøng hĆ“ĆÆp chuyeĆ„n n = 0 laĆøm trƶƓĆøng hĆ“ĆÆp neo ) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 19. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 19 - HoaĆ«c : procedure THN (n : integer ; X,Y,Z : char) begin if (n = 1) then Move(X, Z) else begin THN (n-1 ,X,Z,Y ) ; Move(X, Z ); THN (n -1 ,Y,X,Z ); end ; end; ( LaĆ”y trƶƓĆøng hĆ“ĆÆp chuyeĆ„n n = 1 laĆøm trƶƓĆøng hĆ“ĆÆp neo ) VĆ“Ć¹i thuĆ» tuĆÆc Move(X, Y) moĆ¢ taĆ» thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Y ƱƶƓĆÆc vieĆ”t tuyĆø theo caĆ¹ch theĆ„ hieƤn thao taĆ¹c chuyeĆ„n . e) ChƶƓng trƬnh con maƵ hoĆ¹a giaĆ»i thuaƤt THN trong NNLT C++ : Trong C++ haĆøm con thƶĆÆc hieƤn giaĆ»i thuaƤt THN coĆ¹ daĆÆng : 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 ; } hoaĆ«c : void THN( int n , char X,Y,Z) { if(n = = 1) Move ( X , Z ) ; else { THN(n -1,X,Z,Y ) ; Move ( X, Z ) ; THN(n - 1,Y,X,Z ) ; } return ; } 2. BaĆøi toaĆ¹n chia thƶƓƻng. CoĆ¹ 100 phaĆ n thƶƓƻng Ʊem chia cho 12 hoĆÆc sinh gioĆ»i ƱaƵ ƱƶƓĆÆc xeĆ”p haĆÆng. CoĆ¹ bao nhieĆ¢u caĆ¹ch khaĆ¹c nhau ƱeĆ„ thƶĆÆc hieƤn caĆ¹ch chia? Ta thaĆ”y ngay raĆØng vieƤc tƬm ra lĆ“Ćøi giaĆ»i cho baĆøi toaĆøn seĆ» khoĆ¢ng deĆ£ daĆøng neĆ”u ta khoĆ¢ng tƬm ra caĆ¹ch thĆ­ch hĆ“ĆÆp ƱeĆ„ tieĆ”p caƤn vĆ“Ć¹i noĆ¹. Ta seƵ tƬm giaĆ»i thuaƤt giaĆ»i baĆøi toaĆøn baĆØng phƶƓng phaĆ¹p ƱeƤ quy. TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 20. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 20 - a) ThoĆ¢ng soĆ” hoĆ¹a. Ta seƵ giaĆ»i baĆøi toaĆ¹n Ć“Ć» mĆ¶Ć¹c ƱoƤ toĆ„ng quaĆ¹t : TƬm soĆ” caĆ¹ch chia m vaƤt (phaĆ n thƶƓƻng ) cho n ƱoĆ”i tƶƓĆÆng (hoĆÆc sinh ) coĆ¹ thĆ¶Ć¹ tƶĆÆ . GoĆÆi PART laĆø soĆ” caĆ¹ch chia khi ƱoĆ¹ PART laĆø haĆøm cuĆ»a 2 bieĆ”n nguyeĆ¢n m , n ( PART(m ,n )) . Ta maƵ hoaĆ¹ n ƱoĆ”i tƶƓĆÆng theo thĆ¶Ć¹ tƶĆÆ xeĆ”p haĆÆng 1, 2 , 3 , . . . n ; Si laĆø soĆ” phaĆ n thƶƓƻng maĆø hoĆÆc sinh i nhaƤn ƱƶƓĆÆc . Khi ƱoĆ¹ caĆ¹c ƱieĆ u kieƤn raĆøng buoƤc leĆ¢n caĆ¹ch chia laĆø : Si >= 0 S1 >= S2 >= >= Sn . S1 + S2 + + Sn = m VĆ­ duĆÆ : VĆ“Ć¹i m = 5 , n = 3 ta coĆ¹ 5 caĆ¹ch chia sau : 5 0 0 4 1 0 3 2 0 3 1 1 2 2 1 TĆ¶Ć¹c laĆø PART(5,3 ) = 5 b) CaĆ¹c trƶƓĆøng hĆ“ĆÆp suy bieĆ”n : + m = 0 thƬ seĆ» coĆ¹ duy nhaĆ”t 1 caĆ¹ch chia : moĆÆi hoĆÆc sinh ƱeĆ u nhaƤn ƱƶƓĆÆc 0 phaĆ n thƶƓƻng . VaƤy : PART(0 , n ) = 1 vĆ“Ć¹i moĆÆi n + n = 0 , m <> 0 thƬ seƵ khoĆ¢ng coĆ¹ caĆ¹ch naĆøo ƱeĆ„ thƶĆÆc hieƤn vieƤc chia . VaƤy : PART(m , 0 ) = 0 vĆ“Ć¹i moĆÆi m <> 0 . ( ta coĆ¹ theĆ„ thay trƶƓĆøng hĆ“ĆÆp neo PART(m ,0) = 0 hoaĆ«c trƶƓĆøng hĆ“ĆÆp neo PART(m , 1) = 1 ) c ) PhaĆ¢n raƵ baĆøi toaĆ¹n trong trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t : + m < n khi soĆ” phaĆ n thƶƓng m nhoĆ» hĆ“n soĆ” hoĆÆc sinh n thƬ n - m hoĆÆc sinh xeĆ”p cuoĆ”i seƵ luoĆ¢n khoĆ¢ng nhaƤn ƱƶƓĆÆc gƬ caĆ» trong moĆÆi caĆ¹ch chia . VaƤy : khi n > m thƬ PART(m , n ) = PART(m , m ) . + Trong trƶƓĆøng hĆ“ĆÆp m >= n : soĆ” vaƤt chia (phaĆ n thƶƓƻng ) lĆ“Ć¹n hĆ“n hoaĆ«c baĆØng soĆ” hoĆÆc sinh (ƱoĆ”i tƶƓĆÆng ) ta phaĆ¢n caĆ¹c caĆ¹ch chia laĆøm 2 nhoĆ¹m : * NhoĆ¹m thĆ¶Ć¹ nhaĆ”t khoĆ¢ng daĆønh cho hoĆÆc sinh xeĆ”p cuoĆ”i cuĆøng phaĆ n thƶƓƻng naĆøo caĆ» ( Sn = 0 ) . SoĆ” caĆ¹ch chia naĆøy seƵ baĆØng soĆ” caĆ¹ch chia m phaĆ n thƶƓng cho n -1 hoĆÆc sinh . TĆ¶Ć¹c laĆø : SoĆ” caĆ¹ch chia trong nhoĆ¹m thĆ¶Ć¹ nhaĆ”t = PART(m , n -1 ) . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 21. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 21 - * NhoĆ¹m thĆ¶Ć¹ 2 coĆ¹ phaĆ n cho ngƶƓĆøi cuoĆ”i cuĆøng ( Sn > 0 ) . DeĆ£ thaĆ”y raĆØng soĆ” caĆ¹ch chia cuĆ»a nhoĆ¹m naĆøy baĆØng soĆ” caĆ¹ch chia m - n phaĆ n thƶƓng cho n hoĆÆc sinh ( vƬ phƶƓng thĆ¶Ć¹c chia maĆø taĆ”t caĆ» hoĆÆc sinh ƱeĆ u nhaƤn ƱƶƓĆÆc phaĆ n thƶƓƻng coĆ¹ theĆ„ thƶĆÆc hieƤn baĆØng caĆ¹ch : cho moĆ£i ngƶƓĆøi nhaƤn trĆ¶Ć“Ć¹c 1 phaĆ n thƶƓƻng roĆ i mĆ“Ć¹i chia ). TĆ¶Ć¹c laĆø : SoĆ” caĆ¹ch chia trong nhoĆ¹m thĆ¶Ć¹ 2 = PART(m - n , n ) . VaƤy : vĆ“Ć¹i m>= n PART(m , n ) = PART(m , n -1 ) + PART(m - n , n ) d ) DaĆÆng maƵ giaĆ» cuĆ»a haĆøm PART(m , n ) PART(m , n ) = if(m = 0 ) then return 1 ; else if( n = 1 ) then return 1 ; else if(m < n ) then return PART(m , m) ; else return ( PART(m , n -1) + PART(m - n , n )) e) DaĆÆng haĆøm PART trong NNLT Pascal Function PART(m , n : integer ) : integer ; Begin if ( (m = 0) or ( n = 1) ) then PART := 1 else if(m < n) then PART := PART(m , m ) else PART := PART(m , n -1 ) + PART(m - n , n) ; End ; g) DaĆÆng haĆøm PART trong NN LT C++ int PART( int m , int n ) { if ((m == 0 ) || (n == 0) ) return 1 ; else if(m < n ) retrun ( PART(m , m )) ; else return ( PART(m , n -1 ) + PART( m -n , n ) ) ; } 3. BaĆøi toaĆ¹n tƬm taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² cuĆ»a moƤt daƵy phaĆ n tƶƻ. BaĆøi toaĆ¹n : XuaĆ”t taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² cuĆ»a daƵy A . VĆ­ duĆÆ : VĆ“Ć¹i daƵy A goĆ m N = 3 phaĆ n tƶƻ A[1] = a , A[2] = b , A[3] = c thƬ baĆøi toaĆ¹n baĆ©t phaĆ»i xuaĆ”t 6 hoaĆ¹n vĆ² coĆ¹ theĆ„ cuĆ»a A : a b c a c b c b a b a c c a b b c a VĆ“Ć¹i daƵy A goĆ m N = 4 phaĆ n tƶƻ A[1] = 1 , A[2] = 2 , A[3] = 3 , A[4] =4 thƬ baĆøi toaĆ¹n baĆ©t phaĆ»i xuaĆ”t 24 hoaĆ¹n vĆ² coĆ¹ theĆ„ cuĆ»a A : 1 2 3 4 1 2 4 3 1 4 3 2 4 2 3 1 TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 22. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 22 - 2 1 3 4 2 1 4 3 4 1 3 2 2 4 3 1 1 3 2 4 1 4 2 3 1 3 4 2 4 3 2 1 3 1 2 4 4 1 2 3 3 1 4 2 3 4 2 1 3 2 1 4 4 2 1 3 3 4 1 2 3 2 4 1 2 3 1 4 2 4 1 3 4 3 1 2 2 3 4 1 a) ThoĆ¢ng soĆ” hoĆ¹a baĆøi toaĆ¹n . GoĆÆi HV(v, m ) ( vĆ“Ć¹i v : array[1 . . N ] of T , m :integer ; m ā‰¤ N ; T laĆø moƤt kieĆ„u dƶƵ lieƤu ƱaƵ bieĆ”t trĆ¶Ć“Ć¹c ) laĆø thuĆ» tuĆÆc xuaĆ”t taĆ”t caĆ» caĆ¹c daĆÆng khaĆ¹c nhau cuĆ»a v coĆ¹ ƱƶƓĆÆc baĆØng caĆ¹ch hoaĆ¹n vĆ² m thaĆønh phaĆ n ƱaĆ u cuĆ»a daƵy v VĆ­ duĆÆ : N = 4 , A[1] = 1 , A[2] = 2 , A[3] = 3 , A[4] = 4 thƬ lĆ“Ćøi goĆÆi HV(A ,3 ) xuaĆ”t taĆ”t caĆ» hoaĆ¹n vĆ² cuĆ»a A coĆ¹ ƱƶƓĆÆc baĆØng caĆ¹ch hoaĆ¹n vĆ² 3 phaĆ n tƶƻ ƱaĆ u ( coĆ¹ 6 h vĆ² ) : 1 2 3 4 1 3 2 4 3 2 1 4 2 1 3 4 3 1 2 4 2 3 1 4 ƑeĆ„ giaĆ»i baĆøi toaĆ¹n ƱaĆ«t ra ban ƱaĆ u ta goĆÆi HV(A,N) ). b) TrƶƓĆøng hĆ“ĆÆp neo. VĆ“i m = 1 : HV(v,1) laĆø thuĆ» tuĆÆc giaĆ»i baĆøi toaĆ¹n xuaĆ”t taĆ”t caĆ» caĆ¹c daĆÆng cuĆ»a v coĆ¹ ƱƶƓĆÆc baĆØng caĆ¹ch hoaĆ¹n vĆ² 1 phaĆ n tuĆ» ƱaĆ u . VaƤy HV(v,1) laĆø thuĆ» tuĆÆc xuaĆ”t v. HV(v,1) ā‰” print(v) ā‰” for k:= 1 to N do write(v[k]) c) PhaĆ¢n raƵ baĆøi toaĆ¹n. Ta coĆ¹ theĆ„ tƬm heĆ”t taĆ”t caĆ» caĆ¹c hoaĆ¹n vĆ² m phaĆ n tƶƻ ƱaĆ u cuĆ»a vector V theo caĆ¹ch sau : - GiƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m] , . . . ,V[N] hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) . - ƑoĆ„i choĆ„ V[m] cho V[m-1] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m],... ,V[N] hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) . - ƑoĆ„i choĆ„ V[m] cho V[m-2] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m],ā€¦. ,V[N] hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . . - ƑoĆ„i choĆ„ V[m] cho V[2] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m], . .. ,V[N] hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) . - ƑoĆ„i choĆ„ V[m] cho V[1] ,giƶƵ nguyeĆ¢n caĆ¹c phaĆ n tƶƻ cuoĆ”i V[m], . . . ,V[N] hoaĆ¹n vĆ² m-1 phaĆ n tƶƻ ƱaĆ u ( goĆÆi ƱeƤ quy HV(V ,m - 1) . VaƤy : HV(V,m) ā‰” { SWAP( V[m],V[m] ) ; HV(V,m ā€“ 1) ; SWAP( V[m],v[m-1] ) ; HV(V,m ā€“ 1) ; SWAP( V[m],v[m-2 ] ) ; HV(V,m ā€“ 1) ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 23. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 23 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SWAP (V[m],v[2] ) ; HV(V,m ā€“ 1) ; SWAP( V[m],v[1] ) ; HV(V,m ā€“ 1) ; } ( SWAP(x , y ) laĆø thuĆ» tuĆÆc hoaĆ¹n ƱoĆ„i giaĆ¹ trĆ² cuĆ»a 2 ƱoĆ”i tƶƓĆÆng dƶƵ lieƤu x ,y ) VaƤy : HV(V , m ) ā‰” for k := m downto 1 do begin SWAP( V[m], V[k] ) ; HV(V,m ā€“ 1) ; end ; d) ThuĆ» tuĆÆc hoaĆ¹n vĆ² treĆ¢n NNLT Pascal. . . . . . . . . . . . . . . . . . . const size = Val ; (* Val laĆø haĆØng gĆ­a trĆ² *) type vector = array[1. . size] of typebase; (* typebase laĆø moƤt kieĆ„u dƶƵ lieƤu coĆ¹ thĆ¶Ć¹ tƶĆÆ *) . . . . . . . . . . . . . . . . . . . . . . procedure Swap( var x , y : typebase ) ; var t : typebase ; begin t := x ; x := y ; y := t ; end ; . . . . . . . . . . . . . . . . . . . . . . . . . . procedure print( A : vector ) ; var i : integer ; begin for i:= 1 to size do write( A[i] : 3 ); writeln ; end ; . . . . . . . . . . . . . . . . . . . . . . . . . . Procedure HV( V : vec tor ; m :integer ) ; var k : integer ; begin if (m = 1 ) then print(V) else for k := m downto 1 do begin Swap(V[m] , V[k]); HV(V , m ā€“ 1) ; end ; end ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 24. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 24 - e) ThuĆ» tuĆÆc hoaĆ¹n vĆ² treĆ¢n NNLT C++ . . . . . . . . . . . . . . . . . . . const size = Val ; // Val laĆø haĆØng gĆ­a trĆ² typedef typebase vector[size] ; // typebase laĆø moƤt kieĆ„u dƶƵ lieƤu coĆ¹ thĆ¶Ć¹ tƶĆÆ . . . . . . . . . . . . . . . . . . . . . . void Swap( typebase & x , typebase& y) { typebase t ; t = x ; x = y ; y = t ; } . . . . . . . . . . . . . . . . . . . . . . . . . . void print( const vector &A) { for(int j= 0 ; j <size ; j++ ) cout<< A[j] ; cout << endl ; } . . . . . . . . . . . . . . . . . . . . . . . . . . void HV( const vector &V , int m) { if (m == 1 ) print( V ); else for(int k = m-1 ; k > = 0 ; k-- ) { swap(V[m-1] ,V[k] ) ; HV(V,m-1) ; } } 4. BaĆøi toaĆ¹n saĆ©p xeĆ”p maĆ»ng baĆØng phƶƓng phaĆ¹p troƤn (Sort-Merge). Yƙ tƶƓƻng : ƑeĆ„ saĆ©p xeĆ”p 1 danh saĆ¹ch goĆ m n phaĆ n tƶƻ baĆØng phƶƓng phaĆ¹p troƤn ngƶƓĆøi ta chia danh saĆ¹ch thaĆønh 2 phaĆ n (toĆ„ng quaĆ¹t laĆø nhieĆ u phaĆ n ) , saĆ©p xeĆ”p tƶĆøng phaĆ n, roĆ i troƤn chuĆ¹ng . BaĆøi toaĆ¹n : saĆ©p theo thĆ¶Ć¹ tƶĆÆ khoĆ¢ng giaĆ»m maĆ»ng a : VectorT baĆØng phƶƓng phaĆ¹p troƤn. ( VectorT = array[1 . . size] of T). a) ThoĆ¢ng soĆ” hoaĆ¹: BaĆøi toaĆ¹n ƱƶƓĆÆc khaĆ¹i quaĆ¹t thaĆønh saĆ©p xeĆ”p moƤt daƵy con cuĆ»a daƵy V : VectorT tƶĆø chƦ soĆ” m ƱeĆ”n chƦ soĆ” n vĆ“Ć¹i 1 <= m <= n <= size . Ta ƱaĆ«t teĆ¢n cho baĆøi toaĆ¹n Ć“Ć» daĆÆng toĆ„ng quaĆ¹t laĆø : SM(V,m,n). BaĆøi toaĆ¹n ban ƱaĆ u : saĆ©p daƵy A seĆ» ƱƶƓĆÆc thƶĆÆc hieƤn baĆØng lĆ“Ćøi goĆÆi : SM(A ,1,size). b) TrƶƓĆøng hĆ“ĆÆp taĆ m thƶƓĆøng: ƑoĆ¹ laĆø khi n = m (daƵy saĆ©p chƦ coĆ¹ 1 phaĆ n tƶƻ ), khi ƱoĆ¹ khoĆ¢ng caĆ n laĆøm gƬ caĆ» (thao taĆ¹c roĆ£ng) . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 25. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 25 - c) PhaĆ¢n raƵ trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t : Khi n > m ta thƶĆÆc hieƤn caĆ¹c coĆ¢ng vieƤc sau : + Chia daƵy : a[m] ,a[m+1], . . . , a[n] thaĆønh 2 daƵy con a[m] , . . , a[l] vaĆø a[l+1] , . . . , a[n] + SaĆ©p xeĆ”p tƶĆøng daƵy con thaĆønh caĆ¹c daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ theo giaĆ»i thuaƤt SM . + TroƤn 2 daƵy con coĆ¹ thĆ¶Ć¹ tƶĆÆ laĆÆi thaĆønh daƵy a[m] ,. . . , a[n] mĆ“Ć¹i coĆ¹ thĆ¶Ć¹ tƶĆÆ . ƑeĆ„ thƶĆÆc hieƤn vieƤc troƤn hai daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ thaĆønh moƤt daƵy coĆ¹ thĆ¶Ć¹ tƶĆÆ ta seƵ duĆøng moƤt thuĆ» tuĆÆc khoĆ¢ng ƱeƤ quy Merge(m , l , n) . Ta caĆ n choĆÆn l ƱeĆ„ ƱƶƓĆÆc 2 daƵy con giaĆ»m haĆ¼n kĆ­ch thĆ¶Ć“Ć¹c so vĆ“Ć¹i daƵy ban ƱaĆ u , tĆ¶Ć¹c laĆø choĆÆn l : m < l < l+1 < n . ThƶƓng choĆÆn l laĆø phaĆ n tƶƻ ā€œgiƶƵa ā€œ : l = ( m + n ) div 2 . ThuĆ» tuĆÆc Sort_Merge(m,n) treĆ¢n maĆ»ng V : VectorT vieĆ”t treĆ¢n ngoĆ¢n ngƶƵ PASCAL coĆ¹ daĆÆng : procedure SM (var d: VectorT ; m,n: index); var l : index ; begin if n>m then begin l := (m+n) div 2; SM (d,m,l) ; SM (d,l+1,n) ; Merge (d,m,l,n) ; end ; end ; Trong ƱoĆ¹ SM laĆø thuĆ» tuĆÆc troƤn 2 daƵy taĆŖng ƱeĆ„ ƱƶƓĆÆc moƤt daƵy taĆŖng. ƑeĆ„ saĆ©p maĆ»ng A (daƵy A[1:size]) ta goĆÆi SM(A ,1,size) 5. BaĆøi toaĆ¹n tƬm nghieƤm xaĆ”p xƦ cuĆ»a phƶƓng trƬnh f(x)=0 . BaĆøi toaĆ¹n : HaĆøm f(x) lieĆ¢n tuĆÆc treĆ¢n ƱoaĆÆn [ao,bo] , tƬm moƤt nghieƤm xaĆ”p xƦ vĆ“Ć¹i ƱoƤ chĆ­nh xaĆ¹c Īµ treĆ¢n [ao,bo] cuĆ»a phƶƓng trƬnh f(x) = 0. Yƙ tƶƓƻng cuĆ»a giaĆ»i thuaƤt : - TrƶƓĆøng hĆ“ĆÆp neo : bo - ao < Īµ + NeĆ”u f(ao).f(bo) ā‰¤ 0 thƬ haĆøm f coĆ¹ nghieƤm treĆ¢n [ao,bo] .VaĆø vƬ ta Ʊang tƬm nghieƤm xaĆ”p xƦ vĆ“Ć¹i ƱoƤ chĆ­nh xaĆ¹c Īµ neĆ¢n ao laĆø nghieƤm xaĆ”p xƦ caĆ n tƬm . + NeĆ”u f(ao).f(bo) > 0 thƬ ta xem nhƶ khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ treĆ¢n ƱoaĆÆn xeĆ¹t. - TrƶƓng hĆ“ĆÆp bo - ao ā‰„ Īµ thƬ chia ƱoĆ¢i ƱoaĆÆn [ao,bo] roĆ i tƬm laĆ n lƶƓĆÆt nghieƤm treĆ¢n tƶĆøng ƱoaĆÆn con : ƱoaĆÆn con traĆ¹i, ƱoaĆÆn con phaĆ»i . Ta seƵ xaĆ¢y dƶĆÆng moƤt haĆøm ƱeƤ qui traĆ» veĆ  giaĆ¹ trĆ² laĆø nghieƤm xaĆ”p xƦ cuĆ»a f (neĆ”u coĆ¹),hay moƤt haĆØng E ( ƱuĆ» lĆ“Ć¹n) neĆ”u f khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ treĆ¢n [ao,bo] . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 26. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 26 - a) ThoĆ¢ng soĆ” hoaĆ¹: XeĆ¹t haĆøm ROOT vĆ“Ć¹i 3 thoĆ¢ng soĆ” laĆø g , a,b ,(ROOT(g,a,b)) traĆ» veĆ  giaĆ¹ trĆ² nghieƤm xaĆ”p xƦ Īµ cuĆ»a phƶƓng trƬnh g(x) =0 treĆ¢n ƱoaĆÆn [a,b] hoaĆ«c giaĆ¹ trĆ² C neĆ”u phƶƓng trƬnh xeĆ¹t khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ . ƑeĆ„ giaĆ»i baĆøi toaĆ¹n ban ƱaĆ”u ta goĆÆi haĆøm ROOT(f,ao,bo) . b) TrƶƓĆøng hĆ“ĆÆp taĆ m thƶƓĆøng: ƱoĆ¹ laĆø khi b - a < epsilon . Khi ƱoĆ¹ : if ( g(a).g(b) ) <= 0 then ROOT(g,a,b) = a ; // a laĆø nghieƤm xaĆ”p xƦ else ROOT(g,a,b) = E ; // khoĆ¢ng coĆ¹ nghieƤm xaĆ”p xƦ c) PhaĆ¢n raƵ trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t: khi b - a >= Īµ ta phaĆ¢n [a,b] laĆøm 2 ƱoaĆÆn [a,c] vaĆø [c,b] vĆ“Ć¹i c = (a + b) / 2. - NeĆ”u ROOT(g , a ,c) < E thƬ ROOT(g , a , b ) = ROOT(g ,a ,c) (baĆøi toaĆ¹n tƬm nghieƤm treĆ¢n ƱoaĆÆn [a,c] ) . - coĆøn khoĆ¢ng thƬ ROOT(g , a , b ) = ROOT(g ,c ,b) (baĆøi toaĆ¹n tƬm nghieƤm treĆ¢n ƱoaĆÆn [c ,b] ) . d) HaĆøm tƬm nghieƤm xaĆ”p xƦ treĆ¢n NN Pascal coĆ¹ daĆÆng: const epsilon = ; E = ; Function ROOT(a,b :real ) :real ; var c , R : real ; begin if ((b-a) < epsilon ) then if ( f(a)*f(b) <= 0 ) then ROOT := a else ROOT := L else begin c := (a + b)/2 ; if ( ROOT(a ,c ) < E ) then ROOT := ROOT(a,c) else ROOT := ROOT(c,b) end; e) ChƶƓng trƬnh con tƬm nghieƤm xaĆ”p xƦ trong NN LT C++ const double epsilon = ; const double E = ; double ROOT(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 ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 27. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 27 - double R = ROOT(a,c) ; if( R< E ) return R ; else return ( ROOT(c , b) ) ; } } TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 28. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 28 - CHƖƔNG III KHƖƛ ƑEƄ QUY I. CƔ CHEƁ THƖƏC HIEƄN GIAƛI THUAƄT ƑEƄ QUY. TraĆÆng thaĆ¹i cuĆ»a tieĆ”n trƬnh xƶƻ lyĆ¹ moƤt giaĆ»i thuaƤt Ć“Ć» moƤt thĆ“Ćøi ƱieĆ„m ƱƶƓĆÆc ƱaĆ«c trƶng bĆ“Ć»i noƤi dung caĆ¹c bieĆ”n vaĆø leƤnh caĆ n thƶĆÆc hieƤn keĆ” tieĆ”p. VĆ“Ć¹i tieĆ”n trƬnh xƶƻ lyĆ¹ moƤt giaĆ»i thuaƤt ƱeƤ qui Ć“Ć» tƶĆøng thĆ“Ćøi ƱieĆ„m thƶĆÆc hieƤn, con caĆ n lƶu trƶƵ caĆ» caĆ¹c traĆÆng thaĆ¹i xƶƻ lyĆ¹ Ʊang coĆøn dang dĆ“Ć» . a) XeĆ¹t giaĆ»i thuaƤt ƱeƤ quy tĆ­nh giai thƶĆøa: FAC ( n ) ā‰” if(n = 0 ) then retrun 1 ; else retrun ( n * FAC (n ā€“ 1)) ; SĆ“ ƱoĆ  quaĆ¹ trƬnh tĆ­nh gĆ­a trĆ² 3 ! theo giaĆ»i thuaƤt ƱeƤ quy : FAC(3 ) = 3 * FAC( 2 ) FAC( 0 ) = 1 FAC( 1 ) = 1 * FAC( 0 FAC( 2 ) = 2 * FAC( 1 Khi thƶĆÆc hieƤn lĆ“Ćøi goĆÆi FAC (3 ) seĆ» phaĆ¹t sinh loĆøi goĆÆi FAC (2 ) , ƱoĆ ng thĆ“Ćøi phaĆ»i lƶu giƶƵ thoĆ¢ng tin traĆÆng thaĆ¹i xƶƻ lyĆ¹ coĆøn dang doĆ» ( FAC ( 3 ) = 3 * FAC ( 2 ) ) . ƑeĆ”n lƶƓĆÆt mƬnh lĆ“Ćøi goĆÆi FAC ( 2 ) laĆÆi laĆøm phaĆ¹t sinh lĆ“Ćøi goĆÆi FAC (1 ) ,ƱoĆ ng thĆ“Ćøi vaĆ„n phaĆ»i lƶu trƶƻ thoĆ¢ng tin traĆÆng thaĆ¹i xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» ( FAC (2 ) = 2 * FAC ( 1 ) ) ,.. . CĆ¶Ć¹ nhƶ vaƤy cho tĆ“Ć¹i khi gaĆ«p lĆ“Ćøi goĆÆi trƶƓĆøng hĆ“ĆÆp neo ( FAC (0 ) = 1 ) . TieĆ”p sau quĆ¹a trƬnh goĆÆi laĆø moƤt quĆ¹a trƬnh xƶƻ lyĆ¹ ngƶƓĆÆc ƱƶƓĆÆc thƶĆÆc hieƤn : - DuĆøng giaĆ¹ trĆ² FAC ( 0 ) ƱeĆ„ tĆ­nh FAC ( 1 ) theo sĆ“ ƱoĆ  xƶƻ lyĆ¹ coĆøn lƶu trƶƻ . - DuĆøng giaĆ¹ trĆ² FAC ( 1 ) ƱeĆ„ tĆ­nh FAC ( 2 ) theo sĆ“ ƱoĆ  xƶƻ lyĆ¹ coĆøn lƶu trƶƻ . - DuĆøng giaĆ¹ trĆ² FAC ( 2 ) ƱeĆ„ tĆ­nh FAC ( 3 ) theo sĆ“ ƱoĆ  xƶƻ lyĆ¹ coĆøn lƶu trƶƻ . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 29. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 29 - ƑoĆ ng thĆ“Ćøi vĆ“Ć¹i quĆ¹a trƬnh xƶƻ lyĆ¹ ngƶƓĆÆc laĆø quĆ¹a trƬnh xoĆ¹a boĆ» caĆ¹c thoĆ¢ng tin veĆ  giaĆ»i thuaƤt xƶƻ lyĆ¹ trung gian ( quĆ¹a trƬnh thu hoĆ i vuĆøng nhĆ“Ć¹ ) . b) XeĆ¹t giaĆ»i thuaƤt ƱeƤ quy tĆ­nh giaĆ¹ trĆ² haĆøm FIBONACCI . FIB(n) if ((n = 0 ) or ( n = 1 )) then return 1 ;ā‰” else return ( FIB(n - 1) + FIB(n - 2)) ; SĆ“ ƱoĆ  tĆ­nh FIB(5) : FIB(3) = FIB(1) + FIB(2) FIB(4) = FIB(2) + FIB(3) FIB(5) = FIB(3) + FIB ( ) FIB(2) = FIB(0) + FIB(1) FIB(0) = FIB(1) = FIB(2) = FIB(0) + FIB(1) FIB(0) = 1 FIB(1) = FIB(2) = FIB(0) + FIB(1) FIB(1) = FIB(1) = FIB(3) = FIB(2) + FIB(1)FIB(1) = FIB(0) = c) XeĆ¹t thuĆ» tuĆÆc ƱeƤ quy thaĆ¹p HaĆø NoƤi THN (n , X , Y , Z) THN (n : integer ; X ,Y , Z : char) ā‰” if (n > 0 ) then { THN(n-1,X ,Z ,Y) ; Move(X, Z) ; THN(n-1,Y,X,Z) ; } ƑeĆ„ chuyeĆ„n 3 Ć±Ć³a tƶĆø coƤt A sang coƤt C duĆøng coƤt B laĆøm trung gian ta goĆÆi : THN (3,A,B,C) SĆ“ ƱoĆ  thƶĆÆc hieƤn lĆ“Ćøi goĆÆi THN (3,A,B,C) laĆø : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 30. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 30 - LĆ“Ćøi goĆÆi c/0 LĆ“Ć¹i goĆÆi c/1 LĆ“Ćøi goĆÆi c/2 LĆ“Ćøi goĆÆi c/3 THN(0,A,C,B) THN(1,A,B,C) A ---> C THN(0,B,A,C) THN(2,A,C,B) A ---> B THN(0,C,B,A) THN(1,C,A,B) C --->B THN(0,A,C,B) THN(3,A,B,C) A ---> C THN(0,B,A,C) THN(1,B,C,A) B ---> A THN(0,C,B,A) THN(2,B,A,C) B ---> C THN(0,A,C,B) THN(1,A,B,C) A ---> C THN(0,B,A,C) VĆ“Ć¹i THN(0 ,X , Y , Z ) laĆø trƶƓĆøng hĆ“ĆÆp neo tƶƓng Ć¶Ć¹ng vĆ“Ć¹i thao taĆ¹c roĆ£ng . X ------> Y laĆø thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X sang coƤt Y (MOVE(X,Y)). CaĆ¹c bĆ¶Ć“Ć¹c chuyeĆ„n Ć±Ć³a seĆ» laĆø : A --> C ; A --> B ; C --> B ; A --> C ; B --> A ; B --> C ; A --> C ; LĆ“Ćøi goĆÆi caĆ”p 0 : THN(3 , A , B , C ) seĆ» laĆøm naĆ»y sinh hai lĆ“Ćøi goĆÆi caĆ”p 1 : THN (2 ,A, C, B) ; THN (2 , B , A , C ) cuĆøng vĆ“Ć¹i caĆ¹c thoĆ¢ng tin cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» . CaĆ¹c lĆ“Ćøi goĆÆi caĆ”p 1 : THN(2 , A , C , B ) , THN (2 , B , A ,C ) seĆ» laĆøm naĆ»y sinh caĆ¹c lĆ“Ćøi goĆÆi caĆ”p 2 : THN (1 ,A, B, C) ; THN (1, C , A , B ) ; THN (1 ,B, C, A) ; THN (1, A , B , C ) ; cuĆøng vĆ“Ć¹i caĆ¹c thoĆ¢ng tin cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» . CaĆ¹c lĆ“Ćøi goĆÆi caĆ”p 2 : THN(1 ,A, B, C) ; THN(1, C , A , B ) ; THN(1 ,B, C, A) ; THN(1, A , B , C ) ; seĆ» laĆøm naĆ»y sinh caĆ¹c lĆ“Ćøi goĆÆi caĆ”p 3 daĆÆng : THN(0 ,X, Y, Z) (thao taĆ¹c roĆ£ng tƶƓng Ć¶Ć¹ng vĆ“Ć¹i trƶƓĆøng hĆ“ĆÆp suy bieĆ”n ); cuĆøng vĆ“Ć¹i caĆ¹c thoĆ¢ng tin cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ coĆøn dang dĆ“Ć» . QuaĆ¹ trƬnh goĆÆi dƶĆøng laĆÆi khi gaĆ«p trƶƓĆøng hĆ“ĆÆp suy bieĆ”n . QuĆ¹a trƬnh xƶƻ lyĆ¹ ngƶƓĆÆc vĆ“Ć¹i quaĆ¹ trƬnh goĆÆi baĆ©t ƱaĆ u khi thƶĆÆc hieƤn xong caĆ¹c trƶƓĆøng hĆ“ĆÆp neo nhaĆØm hoaĆøn thieƤn caĆ¹c bĆ¶Ć“Ć¹c xƶƻ lyĆ¹ con dang dĆ“Ć» song song vĆ“Ć¹i quaĆ¹ trƬnh hoaĆøn thieƤn caĆ¹c lĆ“Ćøi goĆÆi laĆø quĆ¹a trƬnh loaĆÆi boĆ» caĆ¹c lƶu trƶƻ thoĆ¢ng tin giaĆ»i thuaƤt trung gian. TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 31. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 31 - Do ƱaĆ«c ƱieĆ„m cuĆ»a quĆ¹a trƬnh xƶƻ lyĆ¹ moƤt giaĆ»i thuaƤt ƱeƤ quy laĆø : vieƤc thƶĆÆc thi lĆ“Ćøi goĆÆi ƱeƤ quy sinh ra lĆ“Ćøi goĆÆi ƱeƤ quy mĆ“Ć¹i cho ƱeĆ”n khi gaĆ«p trƶƓĆøng hĆ“ĆÆp suy bieĆ”n (neo ) cho neĆ¢n ƱeĆ„ thƶĆÆc thi giaĆ»i thuaƤt ƱeƤ quy caĆ n coĆ¹ cĆ“ cheĆ” lƶu trƶƻ thoĆ¢ng tin thoĆ»a caĆ¹c yeĆ¢u caĆ u sau : + Ɣƛ moĆ£i laĆ n goĆÆi phaĆ»i lƶu trƶƵ thoĆ¢ng tin traĆÆng thaĆ¹i con dang dĆ“Ć» cuĆ»a tieĆ”n trƬnh xƶƻ lyĆ¹ Ć“Ć» thĆ“Ćøi ƱieĆ„m goĆÆi. SoĆ” traĆÆng thaĆ¹i naĆøy baĆØng soĆ” laĆ n goĆÆi chƶa ƱƶƓĆÆc hoaĆøn taĆ”t . + Khi thƶĆÆc hieƤn xong (hoaĆøn taĆ”t) moƤt laĆ n goĆÆi, caĆ n khoĆ¢i phuĆÆc laĆÆi toaĆøn boƤ thoĆ¢ng tin traĆÆng thaĆ¹i trĆ¶Ć“Ć¹c khi goĆÆi . + LeƤnh goĆÆi cuoĆ”i cuĆøng (Ć¶Ć¹ng vĆ“Ć¹i trƶƓng hĆ“ĆÆp neo) seƵ ƱƶƓĆÆc hoaĆøn taĆ”t ƱaĆ u tieĆ¢n , thĆ¶Ć¹ tƶĆÆ daƵy caĆ¹c leƤnh goĆÆi ƱƶƓĆÆc hoaĆøn taĆ”t ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ goĆÆi, tƶƓng Ć¶Ć¹ng daƵy thoĆ¢ng tin traĆÆng thaĆ¹i ƱƶƓĆÆc hoĆ i phuĆÆc theo thĆ¶Ć¹ tƶĆÆ ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ lƶu trƶƻ . CaĆ”u truĆ¹c dƶƵ lieƤu cho pheĆ¹p lƶu trƶƵ daƵy thoĆ¢ng tin thoĆ»a 3 yeĆ¢u caĆ u treĆ¢n laĆø caĆ”u truĆ¹c lƶu trƶƻ thoĆ»a luaƤt LIFO (Last In Firt Out ) . MoƤt kieĆ„u caĆ”u truĆ¹c lƶu trƶƻ thƶƓĆøng ƱƶƓĆÆc sƶƻ duĆÆng trong trƶƓĆøng hĆ“ĆÆp naĆøy laĆø caĆ”u truĆ¹c choĆ ng (stack). VĆ“Ć¹i moƤt choĆ ng S thƶƓĆøng cho pheĆ¹p chuĆ¹ng ta thƶĆÆc hieƤn caĆ¹c thao taĆ¹c sau treĆ¢n noĆ¹ : - ThuĆ» tuĆÆc Creatstack(S) : TaĆÆo choĆ ng S roĆ£ng . - ThuĆ» tuĆÆc Push(x,S) : Lƶu trƶƵ theĆ¢m dƶƵ lieƤu x vaĆøo Ć±Ć³nh stack S ( x laĆø dƶƵ lieƤu kieĆ„u ƱƓn giaĆ»n giaĆ»n hoaĆ«c coĆ¹ caĆ”u truĆ¹c ) - ThuĆ» tuĆÆc Pop(x,S) : LaĆ”y giaĆ¹ trĆ² Ʊang lƶu Ć“Ć» Ć±Ć³nh S chĆ¶Ć¹a vaĆøo trong ƱoĆ”i tƶƓĆÆng dƶƵ lieƤu x vaĆø loaĆÆi boĆ» giaĆ¹ trĆ² naĆøy khoĆ»i S ( luĆøi ƱƦnh S xuoĆ”ng moƤt mĆ¶Ć¹c ) . - HaĆøm Empty(S) : ( kieĆ„u boolean ) KieĆ„m tra tĆ­nh roĆ£ng cuĆ»a S : cho giaĆ¹ trĆ² ƱuĆ¹ng neĆ”u S roĆ£ng , sai neĆ”u S khoĆ¢ng roĆ£ng . CaĆøi ƱaĆ«t cuĆÆ theĆ„ cuĆ»a S coĆ¹ theĆ„ thƶĆÆc hieƤn baĆØng nhieĆ u phƶƓng phaĆ¹p phuĆÆ thuoƤc vaĆøo tƶĆøng ngoĆ¢n ngƶƵ laƤp trƬnh vaĆø tƶĆøng muĆÆc Ʊƭch sƶƻ duĆÆng cuĆÆ theĆ„ . VĆ­ duĆÆ : CaĆøi ƱaĆ«t ( baĆØng caĆ”u truĆ¹c maĆ»ng ) choĆ ng S maĆø moĆ£i phaĆ n tƶƻ laĆø moƤt ƱoĆ”i tƶƓĆÆng dƶƵ lieƤu thuoƤc kieĆ„u T trong PASCAL nhƶ sau : Const sizestack = . . . ; Type stackType = record St : array [1 . . sizestack ] of T ; Top : 0 . . sizestack ; end ; ThuĆ» tuĆÆc Creatstack(S) : taĆÆo choĆ ng S roĆ£ng : Procedure Creatstack( var S : StackType ) Begin S.Top := 0 ; End; ThuĆ» tuĆÆc Push(x,S) : CheĆøn - Lƶu trƶƵ theĆ¢m dƶƵ lieƤu x vaĆøo Ć±Ć³nh stack S ( x laĆø dƶƵ lieƤu kieĆ„u ƱƓn giaĆ»n giaĆ»n hoaĆ«c coĆ¹ caĆ”u truĆ¹c ) Procedure Push( var S : StackType ; x : T) ; Begin TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 32. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 32 - S.St[S.Top +1] := x ; S.Top := S.Top + 1 ; End; ThuĆ» tuĆÆc Pop(x,S) : XoĆ¹a - LaĆ”y giaĆ¹ trĆ² Ʊang lƶu Ć“Ć» Ć±Ć³nh S chĆ¶Ć¹a vaĆøo trong ƱoĆ”i tƶƓĆÆng dƶƵ lieƤu x vaĆø loaĆÆi boĆ» giaĆ¹ trĆ² naĆøy khoĆ»i S ( luĆøi ƱƦnh S xuoĆ”ng moƤt mĆ¶Ć¹c ) . Procedure Pop( var S : StackType ; var x : T ) ; Begin x := S.St[S.Top] ; S.Top := S.Top - 1 ; End; HaĆøm Empty(S) : ( HaĆøm boolean ) KieĆ„m tra tĆ­nh roĆ£ng cuĆ»a Stack S Function Empty( S : StackType ) : boolean ; Begin Empty := ( S.Top = 0 ) ; End ; MoĆ¢ hƬnh stack S vaĆø taĆ¹c duĆÆng caĆ¹c thao taĆ¹c treĆ¢n noĆ¹ . ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 3 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 2 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 2 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 2 ā€“ā€“ x 1 ā€“ā€“ā€“ 2 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 1 ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ā€“ 1 ā€“ā€“ā€“x o ā€“ā€“ 1 ā€“ā€“ā€“x o ā€“ā€“ā€“ā€“ 1 ā€“ā€“ā€“x o ā€“ā€“ā€“ā€“ Createstack(S) ; Push(S, xo ) ; Push(S,x1 ) ; pop(S,y) ( S.top = 0 ) S.St[1] := xo S.St[2] := x1 y := x1 S.top := 1 S.top := 2 S.Top := 1 ; NNLT PASCAL vaĆø C++ thƶĆÆc hieƤn ƱƶƓĆÆc cĆ“ cheĆ” ƱeƤ qui nhĆ“Ćø trong quaĆ¹ trƬnh bieĆ¢n dĆ²ch, phaĆ n meĆ m ngoĆ¢n ngƶƵ tƶĆÆ Ć±oƤng phaĆ¹t sinh ra caĆ”u truĆ¹c stack ƱeĆ„ quaĆ»n lyĆ¹ caĆ¹c leƤnh goĆÆi chƶƓng trƬnh con. Khi moƤt leƤnh goĆÆi chƶƓng trƬnh con thƶĆÆc hieƤn, caĆ¹c bieĆ”n Ć±Ć²a phƶƓng (goĆ m caĆ» caĆ¹c thoĆ¢ng soĆ”) seƵ ƱƶƓĆÆc caĆ”p phaĆ¹t vuĆøng nhĆ“Ć¹ mĆ“Ć¹i Ć“Ć» ƱƦnh stack. NhĆ“Ćø vaƤy caĆ¹c taĆ¹c ƱoƤng Ć±Ć²a phƶƓng cuĆ»a thuĆ» tuĆÆc seƵ khoĆ¢ng laĆøm thay ƱoĆ„i caĆ¹c traĆÆng thaĆ¹i xƶƻ lyĆ¹ coĆøn dang dĆ“Ć». II. TOƅNG QUAN VEƀ VAƁN ƑEƀ KHƖƛƻ ƑEƄ QUY. ƑeƤ quy laĆø phƶƓng phaĆ¹p giuĆ¹p chuĆ¹ng ta tƬm giaĆ»i thuaƤt cho caĆ¹c baĆøi toaĆ¹n khoĆ¹ . GiaĆ»i thuaƤt giaĆ»i baĆøi toaĆ¹n baĆØng ƱeƤ quy thƶƓĆøng raĆ”t ƱeĆÆp (goĆÆn gaĆøng, deĆ£ hieĆ„u ,deĆ£ chuyeĆ„n thaĆønh TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 33. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 33 - chƶƓng trƬnh treĆ¢n caĆ¹c NNLT) . Nhƶng nhƶ ƱaƵ chƦ ra Ć“Ć» treĆ¢n vieƤc xƶƻ lyĆ¹ giaĆ»i thuaƤt ƱeƤ quy laĆÆi thƶƓĆøng gaĆ¢y khoĆ¹ khaĆŖn cho maĆ¹y tĆ­nh (toĆ”n khoĆ¢ng gian nhĆ“Ć¹ vaĆø thĆ“Ćøi gian xƶƻ lyĆ¹), hĆ“n nƶƵa khoĆ¢ng phaĆ»i moĆÆi NNLT ƱeĆ u cho pheĆ¹p maƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy (vĆ­ duĆÆ : FORTRAN) . VƬ vaƤy vieƤc thay theĆ” moƤt chƶƓng trƬnh ƱeƤ quy ( coĆ¹ chĆ¶Ć¹a chƶƓng trƬnh con ƱeƤ quy ) baĆØng moƤt chƶƓng trƬnh khoĆ¢ng ƱeƤ quy cuƵng laĆø moƤt vaĆ”n ƱeĆ  ƱƶƓĆÆc quan taĆ¢m nhieĆ u trong laƤp trƬnh . MoƤt caĆ¹ch toĆ„ng quaĆ¹t ngƶƓĆøi ta ƱaƵ chƦ ra raĆØng : MoĆÆi giaĆ»i thuaƤt ƱeƤ quy ƱeĆ u coĆ¹ theĆ„ thay theĆ” baĆØng moƤt giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy . VaĆ”n ƱeĆ  coĆøn laĆÆi laĆø kyƵ thuaƤt xaĆ¢y dƶĆÆng giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy tƶƓng Ć¶Ć¹ng thay theĆ” giaĆ»i thuaƤt ƱeƤ quy . RaĆ”t ƱaĆ¹ng tieĆ”c vieƤc xaƤy dƶĆÆng giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy thay theĆ” cho moƤt giaĆ»i thuaƤt ƱeƤ quy ƱaƵ coĆ¹ laĆÆi laĆø moƤt vieƤc khoĆ¢ng phaĆ»i bao giĆ“Ćø cuƵng ƱƓn giaĆ»n vaĆø ƱeĆ”n nay vaĆ£n chƶa coĆ¹ giaĆ»i phaĆ¹p thoĆ»a ƱaĆ¹ng cho trƶƓĆøng hĆ“ĆÆp toĆ„ng quaĆ¹t. SĆ“ ƱoĆ  ƱeĆ„ xaĆ¢y dƶĆÆng chƶƓng trƬnh cho moƤt baĆøi toaĆ¹n khoĆ¹ khi ta khoĆ¢ng tƬm ƱƶƓĆÆc giaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy thƶƓĆøng laĆø : + DuĆøng quan nieƤm ƱeƤ quy ƱeĆ„ tƬm giaĆ»i thuaƤt cho baĆøi toaĆ¹n . + MaƵ hoĆ¹a giaĆ»i thuaƤt ƱeƤ quy . + Khƶƻ ƱeƤ quy ƱeĆ„ coĆ¹ ƱƶƓĆÆc moƤt chƶƓng trƬnh khoĆ¢ng ƱeƤ quy . Tuy nhieĆ¢n do vieƤc khƶƻ ƱeƤ quy khoĆ¢ng phaĆ»i bao giĆ“Ćø cuƵng deĆ£ vaĆø vƬ vaƤy trong nhieĆ u trƶƓĆøng hĆ“ĆÆp ta cuƵng phaĆ»i chaĆ”p nhaƤn sƶ duĆÆng chƶƓng trƬnh ƱeƤ quy . III. CAƙC TRƖƔƘNG HƔƏP KHƖƛ ƑEƄ QUY ƑƔN GIAƛN. 1. CaĆ¹c trƶƓĆøng hĆ“ĆÆp khƶƻ ƱeƤ quy baĆØng voĆøng laĆ«p . a) HaĆøm tĆ­nh gĆ­a tri cuĆ»a daƵy dƶƵ lieƤu moĆ¢ taĆ» baĆØng hoĆ i quy . a1) Yƙ tƶƓƻng daĆ£n daĆ©t : XeĆ¹t moƤt voĆøng laĆ«p trong ƱoĆ¹ sƶƻ duĆÆng 1 taƤp hĆ“ĆÆp bieĆ”n W = (V , U ) goĆ m taƤp hĆ“ĆÆp U caĆ¹c bieĆ”n bĆ² thay ƱoĆ„i trong voĆøng laĆ«p vaĆø V laĆø caĆ¹c bieĆ”n coĆøn laĆÆi. DaĆÆng toĆ„ng quaĆ¹t cuĆ»a voĆøng laĆ«p laĆø : W := Wo ; { Wo = ( Uo,Vo) } while C(U) do U := g(W) (3.1.1) GoĆÆi Uo laĆø traĆÆng thaĆ¹i cuĆ»a U ngay trĆ¶Ć“Ć¹c voĆøng laĆ«p , Uk vĆ“Ć¹i k >0 laĆø traĆÆng thaĆ¹i cuĆ»a U sau laĆ n laĆ«p thĆ¶Ć¹ k (giaĆ» sƶƻ coĆøn laĆ«p ƱeĆ”n laĆ n k ) . Ta coĆ¹ : Uo mang caĆ¹c giaĆ¹ trĆ² ƱƶƓĆÆc gaĆ¹n ban ƱaĆ u Uk = g(W) = g(Uk-1 , Vo ) = f(uk-1) vĆ“Ć¹i k = 1 .. n (3.1.2) VĆ“Ć¹i n laĆø laĆ n laĆ«p cuoĆ”i cuĆøng , tĆ¶Ć¹c C(Uk ) ƱuĆ¹ng vĆ“Ć¹i moĆÆi k < n , C(Un) sai Sau voĆøng laĆ«p W mang noƤi dung (Un ,Vo ) . Ta thaĆ”y : ƱeĆ„ tĆ­nh gĆ­a trĆ² daƵy ƱƶƓĆÆc Ć±Ć²nh nghĆ³a bĆ“Ć»i quan heƤ hoĆ i quy daĆÆng (3.1.2) ta coĆ¹ theĆ„ duĆøng giaĆ»i thuaƤt laĆ«p moĆ¢ taĆ» bĆ“Ć»i ƱoaĆÆn leƤnh (3.1.1) . a2) GiaĆ»i thuaƤt tĆ­nh gĆ­a trĆ² cuĆ»a daƵy hoĆ i quy thƶƓĆøng gaĆ«p daĆÆng : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 34. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 34 - f(n) = C khi n = no ( C laĆø moƤt haĆØng ) = g(n,f(n -1)) khi n > no VĆ­ duĆÆ : HaĆøm giai thƶĆøa FAC (n) = n ! = 1 khi n = 0 = n * FAC(n - 1) khi n > 0 ToĆ„ng n soĆ” ƱaĆ u tieĆ¢n cuĆ»a daƵy Ʊan daĆ”u sau : Sn = 1 - 3 + 5 - 7 .. + (-1)n+1 * (2n-1) S(k) = 1 khi k =1 = S(k-1) + (- 1)k+1 *(2*k-1) vĆ“Ć¹i k > 1 - GiaĆ»i thuaƤt ƱeƤ quy tĆ­nh giaĆ¹ trĆ² f(n) f(n) = if(n = no) then return C ; else return (g(n,f(n -1)) ; - GiaĆ»i thuaƤt laĆ«p tĆ­nh giaĆ¹ tri f(n) k := no ; F := C ; { F = f(no) } While( k < n ) do begin k := k +1 ; F := g(k,F ) ; end ; } { F = f(n) } HoaĆ«c : F := C ; For k := no to n -1 do begin k := k + 1 ; F := g(k,F) ; end ; Trong trƶƓĆøng hĆ“ĆÆp naĆøy : W = U = ( k ,F ) Wo = Uo = ( no,C ) C(U) = ( k < n) f(W) = f(U) = f(k,F) = (k+1,g(k,F))) VĆ­ duĆÆ 1: HaĆøm tĆ­nh FAC(n) = n! khoĆ¢ng ƱeƤ quy + Trong NN LT PASCAL Function FAC ( n : integer ) : longint ; var k : integer ; F : longint ; Begin F := 1 ; k := 0 ; while (k < n ) do begin TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 35. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 35 - k := k + 1 ; F := F * k ; end ; FAC := F ; end ; hoaĆ«c : Function FAC ( n : integer ) : longint ; var k : integer ; F : longint ; Begin F := 1 ; For k:= 1 to n do F := F * k ; FAC := F ; end ; + Trong NN LT C++ long int FAC ( int n ) { int k = 0 ; long int F = 1 ; while ( k < n ) F = ++k * F ; return (F) ; } HoaĆ«c : long int FAC ( int n ) { long int F = 1 ; for ( int k = 1; k <= n ; k++) F = k * F ; return (F) ; } VĆ­ du 2 : DaĆÆng haĆøm Sn khoĆ¢ng ƱeƤ quy + treĆ¢n NN LT Pascal : Function S(n : integer ) : integer ; var k ,tg : integer ; Begin k := 1 ; tg := 1 ; while ( k < n ) do begin k := k + 1 ; if odd (k) then tg := tg + (2 * k - 1 ) else tg := tg - (2 * k - 1 ) ; end ; S := tg ; end ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 36. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 36 - + Trong NN LT C++ int S ( int n ) { int k = 1 , tg = 1 ; while ( k < n ) { k ++ ; if (k%2) tg + = 2 * k - 1 ; else tg - = 2 * k + 1 ; } return ( tg ) ; } b) CaĆ¹c thuĆ» tuĆÆc ƱeƤ qui daĆÆng ƱeƤ qui ƱuoĆ¢i. XeĆ¹t thuĆ» tuĆÆc P daĆÆng : P(X) ā‰” if B(X) then D(X) else { A(X) ; P(f(X)) ; } Trong ƱoĆ¹ : X laĆø taƤp bieĆ”n ( moƤt hoaĆ«c moƤt boƤ nhieĆ u bieĆ”n ). P(X) laĆø thuĆ» tuĆÆc ƱeƤ quy phuĆÆ thuoƤc X A(X) ; D(X) laĆø caĆ¹c nhoĆ¹m thao taĆ¹c (leƤnh ) khoĆ¢ng ƱeƤ quy f(X) laĆø haĆøm bieĆ”n ƱoĆ„i X XeĆ¹t quĆ¹a trƬnh thi haĆønh P(X) : goĆÆi Po laĆø laĆ n goĆÆi P thĆ¶Ć¹ 0 (ƱaĆ u tieĆ¢n ) P(X) P1 laĆø laĆ n goĆÆi P thĆ¶Ć¹ 1 (laĆ n 2) P(f(X)) Pi laĆø laĆ n goĆÆi P thĆ¶Ć¹ i ( laĆ n i + 1) P(f(f(...f(X)...) ( P(fi(X)) hĆ“ĆÆp i laĆ n haĆøm f ) Trong laĆ n goĆÆi Pi neĆ”u B(fi(X)) khoĆ¢ng ƱuĆ¹ng (false) thƬ thi haĆønh leƤnh A vaĆø goĆÆi Pi+1 ; neĆ”u B(fi(X)) ƱuĆ¹ng (true) thƬ thi haĆønh leƤnh D vaĆø keĆ”t thuĆ¹c quĆ¹a trƬnh goĆÆi . GiaĆ» sƶƻ P ƱƶƓĆÆc goĆÆi ƱuĆ¹ng n +1 laĆ n . Khi ƱoĆ¹ Ć“Ć» trong laĆ n goĆÆi cuoĆ”i cuĆøng (thĆ¶Ć¹ n ) Pn thƬ B(fn(X)) ƱuĆ¹ng , leƤnh D ƱƶƓĆÆc thi haĆønh vaĆø chaĆ”m dĆ¶Ć¹t thao taĆ¹c goĆÆi thuĆ» tuĆÆc P . SĆ“ ƱoĆ  khoĆ”i quaĆ¹ trƬnh thƶĆÆc hieƤn leƤnh goĆÆi thuĆ» tuĆÆc P(X) coĆ¹ daĆÆng sau : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 37. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 37 - P(X) True False B(X) A(X) ; X : = f(X) END D(X) TƶƓng Ć¶Ć¹ng vĆ“Ć¹i voĆøng laĆ«p sau : While ( not B(X) ) do begin A(X) ; X := f(X) ; end ; D(X) ; VĆ­ duĆÆ 1 : ƑeĆ„ ƱoĆ„i 1 soĆ” nguyeĆ¢n khoĆ¢ng aĆ¢m y Ć“Ć» cĆ“ soĆ” 10 sang daĆÆng cĆ“ soĆ” k ( 2 <= k <= 9 ) vĆ“Ć¹i vieƤc duĆøng maĆ»ng A ( A : array[1 . . size ] of 0..k -1 , size laĆø moƤt haĆØng ƱƶƓĆÆc khai baĆ¹o trĆ¶Ć“Ć¹c ) ƱeĆ„ chĆ¶Ć¹a caĆ¹c kyĆ¹ soĆ” trong heƤ k phaĆ¢n ( vĆ“Ć¹i quy Ć¶Ć“Ć¹c kyĆ¹ soĆ” coĆ¹ yĆ¹ nghĆ³a thaĆ”p ƱƶƓĆÆc chĆ¶Ć¹a Ć“Ć» chƦ soĆ” cao ) khi ƱoĆ¹ thuĆ» tuĆÆc ƱeƤ quy Convert(x,m) ƱeĆ„ taĆÆo daƵy gĆ­a trĆ² : A[0] , A[1] , . . . , A[m] nhƶ sau (haƵy tƶĆÆ giaĆ»i thĆ­ch ) : Convert(n,m) ā‰” if n <> 0 then Begin A[m] := n mod k ; Convert(n div k , m -1) ; End ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 38. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 38 - LeƤnh goĆÆi Convert(y,n) duĆøng ƱeĆ„ ƱoĆ„i soĆ” nguyeĆ¢n y trong cĆ“ soĆ” 10 sang cĆ“ soĆ” k lƶu daƵy kyĆ¹ soĆ” trong maĆ»ng A ; Trong vĆ­ duĆÆ naĆøy ta coĆ¹ : X laĆø ( n, m ) ; B(X) laĆø bieĆ„u thĆ¶Ć¹c boolean not( n <> 0 ) A(X) laĆø leƤnh gaĆ¹n A[m] := n mod k ; f(X) laĆø haĆøm f(n,m ) = ( n div k , m - 1 ) ; D(X) laĆø leƤnh roĆ£ng Ƒoan leƤnh laĆ«p tƶƓng Ć¶Ć¹ng vĆ“Ć¹i thuĆ» tuĆÆc Convert(x,m) laĆø : While (n <> 0) then begin A[m] := n mod k ; { A(X) } n := n div k ; { X := f(X) } m := m - 1 ; end ; VĆ­ duĆÆ 2 : TƬm USCLN cuĆ»a 2 soĆ” nguyeĆ¢n dƶĆÆa vaĆøo thuaƤt toaĆ¹n Euclide . - GiaĆ»i thuaƤt ƱeƤ quy (dĆ¶Ć“Ć¹i daĆÆng thuĆ» tuĆÆc ) tƬm USCLN(m,n) baĆØng thuaƤt toaĆ¹n Euclide : USCLN(m , n , var us) ā‰” if ( n = 0 ) then us := m else USCLN(n , m mod n , us ) ; - Trong trƶƓĆøng hĆ“ĆÆp naĆøy thƬ : X laĆø ( m , n , us ) P(X) laĆø USCLN(m ,n ,us) B(X) laĆø n = 0 D(X) laĆø leƤnh gaĆ¹n us := m A(X) laĆø leƤnh roĆ£ng f(X ) laĆø f(m,n,us) = ( n , m mod n ,us ) - ƑoaĆÆn leƤnh laĆ«p tƶƓng Ć¶Ć¹ng laĆø : While (n <> 0 ) do begin sd := m mod n ; m := n ; n := sd ; end ; us := m ; - ThuĆ» tuĆÆc khoĆ¢ng ƱeƤ quy tƶƓng Ć¶Ć¹ng trong Pascal . TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 39. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 39 - Procedure USCLN(m , n : integer ; var us : integer ) ; var sd : integer ; begin while ( n <> 0 ) do begin sd := m mod n ; m := n ; n := sd ; end ; us := m ; end ; - HaĆøm con khoĆ¢ng ƱeƤ quy tƶƓng Ć¶Ć¹ng trong C++ void USCLN(int m , int n , int& us ) { while(n != 0 ) { int sd = m % n ; m = n ; n = sd ; } us = m ; } c) CaĆ¹c haĆøm ƱeƤ qui daĆÆng ƱeƤ qui ƱuoĆ¢i (tail-recusive). XeĆ¹t haĆøm ƱeƤ qui daĆÆng : f(g(X)) khi C (X) ƱuĆ¹ng f ( X ) = a (X ) khi C (X) sai TĆ¶Ć¹c laĆø : f ( X ) ā‰” if( C(X) ) then return( f(g(X)) else return( a(x)) TĆ­nh f(Xo ) . Ta coĆ¹ : f(Xo ) = f(g(Xo )) vĆ“Ć­ C(Xo ) ƱuĆ¹ng . = f(g(g(Xo ))) vĆ“Ć¹i C(g(Xo )) ƱuĆ¹ng . = ... = f(gk (Xo )) vĆ“Ć¹i C(gk-1 (Xo )) ƱuĆ¹ng . = a(gk (Xo )) vĆ“Ć¹i C(gk (Xo )) sai. ( gk (xo) = g(g (g (xo))))) ) ƑaĆ«t : Uo = Xo = go (Xo ) Ui = gi (Xo ) = g(gi-1 (Xo )) = g(Ui-1 ) vĆ“Ć¹i i >= 1 Ta coĆ¹ quan heƤ sau : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 40. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 40 - Uo = Xo Ui = g(Ui-1 ) i = 1 ... k . VĆ“Ć¹i k laĆø soĆ” nhoĆ» nhaĆ”t maĆø C(Uk ) sai . LuĆ¹c ƱoĆ¹ : f(Xo ) = a(Uk ) VaƤy ƱoaĆÆn chƶƓng trƬnh tĆ­nh f = f(Xo) laĆø : U := Xo ; while C(U) do U := g(U) ; f := a(U) ; VĆ­ duĆÆ : VĆ“Ć¹i m , n > = 0 ta coĆ¹ haĆøm ƱeƤ quy tĆ­nh USCLN(m,n) laĆø : USCLN(m ,n ) ā‰” if (m <> 0 ) then return(USCLN ( abs(m - n) , min(m , n) ) ; else return n ; Trong trƶƓĆøng hĆ“ĆÆp naĆøy : X laĆø (m ,n ) ; C (X) = C(m ,n) laĆø m <> 0 ; g(X) = g(m ,n ) = (abs(m -n ) , min (m ,n ) ) ; a(x) = a(m ,n ) = n ; - ƑoaĆÆn chƶƓng trƬnh tĆ­nh USCLN(a ,b) laĆø : m := a ; n := b ; while ( m <> 0 ) do begin t1 := m ; t2 := n ; m := abs(t1 - t2 ) ; n := min(t1,t2 ) ; end ; USCLN := n ; - HaĆøm khoĆ¢ng ƱeƤ qui tƶƓng Ć¶Ć¹ng trong Pascal. Function USCLN(m , n : integer ) : integer ; var t1 , t2 : integer ; begin while (n <> 0 ) do begin t1 := m ; t2 := n ; m := abs(t1 - t2 ) ; if(t1 < t2 ) then n := t1 else n := t2 ; end ; USCLN := m ; - DaĆÆng haĆøm tƶƓng Ć¶Ć¹ng trong C++ int USCLN(int m , int n) { while( n != 0) { int t1 = m ; int t2 = n ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 41. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 41 - m = abs(t1-t2) ; if(t1<t2) n = t1 ; else n = t2 ; } return(m) ; } 2. Khƶƻ ƱeƤ quy haĆøm ƱeƤ quy arsac a) DaĆÆng haĆøm ƱeƤ qui ARSAC. a1) DaĆÆng toaĆ¹n hoĆÆc : DS(A(CS(X) ) , FS(CS(X) , X ) ) ) khi C(X) ƱuĆ¹ng A(X) = BS(X) khi C(X) sai a2) DaĆÆng maƵ giaĆ» : A(X ) ā‰” if C(X) then return ( DS (A(CS(X)) ,FS(CS(X),X) ) else return (BS(X ) ) VĆ“Ć¹i : BS , CS , DS , FS laĆø caĆ¹c giaĆ»i thuaƤt khoĆ¢ng ƱeƤ qui . TrƶƓĆøng hĆ“ĆÆp thƶƓĆøng gaĆ«p laĆø : BS(X) , CS(Y) , DS(U,V) , FS(U,V) laĆø caĆ¹c thao taĆ¹c ƱƓn giaĆ»n , khoĆ¢ng coĆ¹ leƤnh goĆÆi haĆøm con . X , Y ,U , V laĆø bieĆ”n ƱƓn trĆ² hoaĆ«c bieĆ”n veĆ¹c tĆ“ . ƑaĆ¢y laĆø daĆÆng toĆ„ng quaĆ¹t cuĆ»a haĆøm ƱeƤ quy chƦ goĆÆi ƱeĆ”n chĆ­nh noĆ¹ moƤt laĆ n . b) SĆ“ ƱoĆ  toĆ„ng quaĆ¹t tĆ­nh gĆ­a trĆ² A(X) : GoĆÆi Uo = X laĆø gĆ­a trĆ² ƱoĆ”i soĆ” caĆ n tĆ­nh cuĆ»a haĆøm A . VieƤc tĆ­nh A(Uo) seƵ phaĆ¹t sinh leƤnh goĆÆi tĆ­nh A(U1) vĆ“Ć¹i U1 = CS(Uo) ( gƦa sƶƻ C(Uo) true ). CĆ¶Ć¹ nhƶ vaƤy , khi maĆø C(Ui ) coĆøn ƱuĆ¹ng thƬ vieƤc tĆ­nh A(Ui ) seƵ phaĆ¹t sinh leƤnh tĆ­nh A(Ui+1) vĆ“Ć¹i Ui+1 = CS(Ui ). VĆ“Ć¹i giaĆ» thieĆ”t laĆø Uo = X thuoƤc mieĆ n xaĆ¹c Ć±Ć²nh cuĆ»a A , thƬ quaĆ¹ trƬnh laĆ«p laĆÆi caĆ¹c leƤnh goĆÆi naĆøy phaĆ»i dƶĆøng laĆÆi sau hƶƵu haĆÆn laĆ n goĆÆi . TĆ¶Ć¹c laĆø āˆƒ k thoĆ»a : C(Uo) = C(U1) = . . = C(Uk-1) = true , C(Uk) = false. XeĆ¹t 2 daƵy soĆ” : - DaƵy : { Ui } = { CS(Ui) } ( 2.1) Uo = X { cho trĆ¶Ć“Ć¹c } Ui+1 = CS(Ui) i = 0 . . k-1 - DaƵy : { Vi } = { A(Ui) } (2.2) Vo = A(Uo) = A(Xo) ( gĆ­a trĆ² caĆ n tĆ­nh ). Vi = A(Ui) = DS(A(CS(Ui ), FS(CS(Ui), Ui ) ) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 42. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 42 - = DS(A(Ui+1),FS(Ui+1,Ui)) = DS(Vi+1,FS(Ui+1,Ui)) vĆ“Ć¹i 0< i < k ( vƬ C(Ui) ƱuĆ¹ng ) Vk = BS(Uk) ( vƬ C(Uk) = false ) DƶĆÆa vaĆøo 2 daƵy soĆ” {Ui } ,{Vi} ( moĆ¢ taĆ» bĆ“Ć»i (2.1) vaĆø (2.2) ) ta tĆ­nh A(X ) theo giaĆ»i thuaƤt sau : - TĆ­nh vaĆø ghi nhĆ“Ć¹ caĆ¹c Ui tƶĆø 0 ƱeĆ”n k theo (2.1). ( VĆ“Ć¹i C(Uo) = C(U1) = ...= C(Uk-1) = True , C(Uk) = False ) - Sƶƻ duĆÆng daƵy gĆ­a trĆ² Ui ƱeĆ„ tĆ­nh laĆ n ngƶƓĆÆc Vi tƶĆø k xuoĆ”ng 0 theo (2.2) , Vo chĆ­nh laĆø gĆ­a trĆ² caĆ n tĆ­nh ( Vo = A(X ) ). c) GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy tĆ­nh gĆ­a trĆ² haĆøm Arsac baĆØng sƶƻ duĆÆng caĆ”u truĆ¹c Stack . ƑeĆ„ thƶĆÆc hieƤn giaĆ»i thuaƤt treĆ¢n thƬ daƵy Ui phaĆ»i ƱƶƓĆÆc tĆ­nh vaĆø lƶu trƶƻ trong moƤt caĆ”u truĆ¹c dƶƵ lieƤu thĆ­ch hĆ“ĆÆp , ƱeĆ„ khi caĆ n ƱeĆ”n (khi tĆ­nh Vi ) deĆ£ laĆ”y ra sƶƻ duĆÆng . ƑaĆ«c ƱieĆ„m quan trong cuĆ»a daƵy Ui laĆø thoĆ»a luaƤt LIFO : thĆ¶Ć¹ tƶĆÆ sƶƻ duĆÆng ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ taĆÆo sinh . CaĆ”u truĆ¹c dƶƵ lieƤu cho pheĆ¹p lƶu trƶƵ thuaƤn lĆ“ĆÆi daƵy phaĆ n tƶƻ thoĆ»a luaƤt LIFO ( vaĆøo sau ra trĆ¶Ć“Ć¹c - Last In First Out ) laĆø caĆ¢u truĆ¹c Stack . ( TreĆ¢n caĆ”u truĆ¹c Stack 2 thao taĆ¹c cĆ“ baĆ»n ƱaĆ«c trƶng laĆø : + Push(S,X) : CheĆøn phaĆ n tƶƻ dƶƵ lieƤu X vaĆøo Ć±Ć³nh Stack S . + Pop(S,X) : LaĆ”y ra khoĆ»i stack S phaĆ n tƶƻ dƶƵ lieƤu Ć“Ć» Ć±Ć³nh vaĆø chĆ¶Ć¹a noĆ¹ vaĆøo bieĆ”n X ). GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ qui tĆ­nh Vo = A(X) dƶĆÆa treĆ¢n 2 coĆ¢ng thĆ¶Ć¹c (2.1 ) , (2. 2 ) vaĆø sƶƻ duĆÆng Stack S laĆø : + BĆ¶Ć“Ć¹c 1 : tĆ­nh Ui baĆ©t ƱaĆ u tƶĆø Uo theo (2.1) lƶu vaĆøo Stack S CreateStack(S) ; ( taĆÆo stack roĆ£ng S ) k := 0 ; U := X ; ( Uo = X ) push(S,U) ; ( cheĆøn UO vaĆøo Ć±Ć³nh stack S ) while C(U) do begin k := k+1 ; U := CS(U) ; ( Uk+1 = CS(Uk)) push (S,U) ; ( cheĆøn Uk+1 vaĆøo Ć±Ć³nh Stack S ) end ; + BĆ¶Ć“Ć¹c 2 : LaĆ”y dƶƵ lieƤu trong Stack S tĆ­nh Vi theo (2. 2) pop(S,U) ; ( U = Uk ) V := BS(U) ; ( C(Uk) sai ; V=Vk = BS (Uk)) for i := k -1 downto 0 do begin Y := U ; ( Y = Ui+1) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 43. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 43 - pop(S,U) ; ( U = Ui ) V := DS(V,FS(Y,U)) ; ( C(Ui) ƱuĆ¹ng ; Vi = DS(Vi+1,FS(Ui+1,Ui)) ) end ; { V = A(Xo) } HoaĆ«c : + BĆ¶Ć“Ć¹c 1 : tĆ­nh Ui baĆ©t ƱaĆ u tƶĆø Uo theo (2.1) lƶu vaĆøo Stack S CreateStack(S) ; ( taĆÆo stack roĆ£ng S ) U := Xo ; ( Uo = Xo ) push(S,U) ; ( cheĆøn UO vaĆøo Ć±Ć³nh stack S ) while C(U) do begin U := CS(U) ; ( UK+1 = CS(UK)) push (S,U) ; ( cheĆøn Uk+1 vaĆøo Ć±Ć³nh Stack S ) end ; + BĆ¶Ć“Ć¹c 2 : LaĆ”y dƶƵ lieƤu trong Stack S tĆ­nh Vi theo (2. 2) pop(S,U) ; ( U = Uk ) V := BS(U) ; ( C(Uk) sai ; V=Vk = BS (Uk)) While(not emptystack(S)) do begin Y := U ; ( Y = Ui+1) pop(S,U) ; ( U = Ui ) V := DS(V,FS(Y,U)) ; ( C(Ui) ƱuĆ¹ng ; Vi = DS(Vi+1,FS(Ui+1,Ui)) ) end ; { V = A(Xo) } CĆ“ cheĆ” lƶu trƶƻ daƵy dƶƵ lieƤu LIFO baĆØng Stack laĆø moƤt ƱaĆ«c trƶng cuĆ»a quaĆ¹ trƬnh xƶƻ lyĆ¹ giaĆ»i thuaƤt ƱeƤ quy ƱieĆ u caĆ n quan taĆ¢m laĆø caĆ”u truĆ¹c stack thƶƓĆøng chieĆ”m nhieĆ u boƤ nhĆ“Ć¹ . VƬ vaƤy ngƶƓĆøi ta luoĆ¢n tƬm caĆ¹ch traĆ¹nh duĆøng noĆ¹ khi coĆøn traĆ¹nh ƱƶƓĆÆc . d) MoƤt soĆ” haĆøm Arsac ƱaĆ«c bieƤt maĆø vieƤc khƶƻ ƱeƤ qui giaĆ»i thuaƤt tĆ­nh gĆ­a trĆ² haĆøm coĆ¹ theĆ„ khoĆ¢ng duĆøng Stack . d1) TrƶƓĆøng hĆ“ĆÆp thuĆ» tuĆÆc CS laĆø song aĆ¹nh . TrƶƓĆøng hĆ“ĆÆp CS laĆø song aĆ¹nh tƶĆø mieĆ n D leĆ¢n mieĆ n D thƬ haĆøm CS coĆ¹ haĆøm ngƶƓĆÆc CS-1 . GoĆÆi haĆøm ngƶƓĆÆc cuĆ»a haĆøm CS laĆø haĆøm CSM1 . Ta coĆ¹ : CSM1(CS(X)) = CS-1 (CS(X)) = X vĆ“Ć¹i āˆ€ X āˆˆ D . NeĆ¢n : CSM1(Ui+1) = CS-1 (CS(Ui)) = Ui vĆ“Ć¹i i = k-1, . . ,1,0 Khi ƱoĆ¹ ta khoĆ¢ng caĆ n lƶu giƶƵ caĆ¹c giaĆ¹ trĆ² trung gian cuĆ»a daƵy { Ui } maĆø chƦ caĆ n xuaĆ”t phaĆ¹t tƶĆø Uk duĆøng haĆøm CSM1 ƱeĆ„ khoĆ¢i phuĆÆc laĆÆi caĆ¹c gĆ­a trĆ² Ui voĆ¹i i<k . GiaĆ»i thuaƤt tĆ­nh A(X ) seƵ trĆ“Ć» thaĆønh : + BĆ¶Ć“Ć¹c 1 : DƶĆÆa vaĆøo (2.1) tĆ­nh Uk TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 44. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 44 - U := X ; ( Uo = X ) k := 0 ; while C(U) do begin k := k+1 ; U := CS(U) ; ( UK+1 = CS(UK)) end ; + BĆ¶Ć“Ć¹c 2 : TĆ­nh Vk , Vk-1, .. V1, Vo dƶĆÆa vaĆøo Uk ,(2.2) vaĆø CSM1 V := BS(U) ; ( V=Vk = BS (Uk) ) for i := k -1 downto 0 do begin Y := U ; ( Y = Ui+1 ) U := CSM1(U) ; (Ui = CSM1(Ui+1) ) V := DS(V,FS(Y,U)) ; ( Vi = DS(Vi+1,FS(Ui+1,Ui) ) end ; { V = Vo = A(X )} d2) TrƶƓĆøng hĆ“ĆÆp thuĆ» tuĆÆc DS coĆ¹ tĆ­nh hoaĆ¹n vĆ² . XeĆ¹t coĆ¢ng thĆ¶Ć¹c tĆ­nh : Vi = DS(Vi+1,FS(Ui+1,Ui)) vĆ“Ć¹i moĆÆi i<k ƑaĆ«t : Uā€™i = FS(Ui+1,Ui ) DS(Vi+1,Uā€™i) = Vi+1 T Uā€™i Ta coĆ¹ : Vo = DS(V1, FS(U1,Uo) = DS(V1,Uā€™o) = V1 T Uā€™0 V1 = DS(V2, FS(U2,U1) = DS(V2,Uā€™1) = V2 T Uā€™1 V2 = DS(V3, FS(U3,U2) = DS(V3,Uā€™2) = V3 T Uā€™2 .............................................................................. .............................................................................. Vi = DS(Vi+1, FS(Ui+1,Ui) = DS(Vi+1,Uā€™i) = Vi+1 T Uā€™i ( 3 - 1 ) .............................................................................. .............................................................................. Vk-1 = DS(Vk, FS(Uk,Uk-1) = DS(Vk,Uā€™k-1) = Vk T Uā€™k-1 Vk = BS(Uk) Khi DS coĆ¹ tĆ­nh hoaĆ¹n vĆ² tĆ¶Ć¹c : DS(DS(x,y),z) = DS(DS(x,z),y) ( VieĆ”t treĆ¢n kyĆ¹ hieƤu T : (x T y) T z = (x T z) T y ThƶĆÆc hieƤn theĆ” laĆ n lƶƓĆÆt V1 roĆ i V2 ... trong coĆ¢ng thĆ¶Ć¹c Vo. Ta coĆ¹ : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 45. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 45 - Vo = V1 T Uā€™0 = ( V2 T Uā€™1) T Uo = ( V2 T Uā€™0 ) T Uā€™1 = ( ( V3 T Uā€™2) T Uā€™o) T Uā€™1 = ((V3 T Uā€™2) T Uā€™o ) T Uā€™1 = ( (V3 T Uā€™o) T Uā€™2 ) T Uā€™1 = ( (V3 T Uā€™o) T Uā€™1 ) T Uā€™2 ....................................................................................................... ....................................................................................................... V0 = ( .... ((( Vk T Uā€™o) T Uā€™1) T Uā€™2 ) T ........T Uā€™k-2) T Uā€™k-1 (3 - 2 ) (3 - 2) laĆø moƤt daƵy lieĆ¢n tieĆ”p ( moƤt toĆ„ng ) k pheĆ¹p toaĆ¹n T maĆø ta ƱaƵ bieĆ”t giaĆ»i thuaƤt tĆ­nh. ThƶĆÆc vaƤy : ThieĆ”t laƤp daƵy Wi nhƶ sau : W0 = Vk Wi = Wi-1 T Uā€™i-1 vĆ“Ć¹i i = 1..k TĆ¶Ć¹c laĆø : Wo = Vk = BS(Uk ) (3 - 3 ) Wi = Wi-1 T Uā€™i-1 = DS(Wi-1,FS(Ui,Ui-1)) i=1..k Wk chĆ­nh laĆø gĆ­a trĆ² Vo caĆ n tĆ­nh . Nhƶ vaƤy giaĆ»i thuaƤt tĆ­nh Wk ( Vo = A(X ) ) goĆ m 2 bĆ¶Ć“Ć¹c : BĆ¶Ć“Ć¹c 1: XaĆ¹c Ć±Ć²nh k vaĆø Uk theo coĆ¢ng thĆ¶Ć¹c ( 1 - 1 ) BĆ¶Ć“Ć¹c 2: TĆ­nh daƵy Wi , trong luĆ¹c tĆ­nh thƬ phaĆ»i tĆ­nh laĆÆi daƵy Ui ,theo ( 3 - 3) A(X ) = Vo = Wk . GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ qui tƶƓng Ć¶Ć¹ng dƶƓĆÆc xem nhƶ baĆøi taƤp . 3. Khƶƻ ƱeƤ quy moƤt soĆ” daĆÆng thuĆ» tuĆÆc ƱeƤ quy thƶƓĆøng gaĆ«p. a) DaĆ£n nhaƤp. ƑeĆ„ thƶĆÆc hieƤn moƤt chƶƓng trƬnh con ƱeƤ quy thƬ heƤ thoĆ”ng phaĆ»i toĆ„ chĆ¶Ć¹c vuĆøng lƶu trį»Æ thoĆ»a quy taĆ©c LIFO (vuĆøng Stack). VƬ vaƤy chƦ nhƶƵng ngoĆ¢n ngƶƵ laƤp trƬnh coĆ¹ khaĆ» naĆŖng taĆÆo vuĆøng nhĆ“Ć¹ stack mĆ“Ć¹i cho pheĆ¹p toĆ„ chĆ¶Ć¹c caĆ¹c chƶƓng trƬnh con ƱeƤ quy. ThƶĆÆc hieƤn moƤt chƶƓng trƬnh con ƱeƤ quy theo caĆ¹ch maĆ«c Ć±Ć²nh thƶƓĆøng toĆ”n boƤ nhĆ“Ć¹ vƬ caĆ¹ch toĆ„ chĆ¶Ć¹c Stack moƤt caĆ¹ch maĆ«c Ć±Ć²nh thĆ­ch hĆ“ĆÆp cho moĆÆi trƶƓĆøng hĆ“ĆÆp thƶƓĆøng laĆø khoĆ¢ng toĆ”i ƶu trong tƶĆøng trƶƓĆøng hĆ“ĆÆp cuĆÆ theĆ„. VƬ vaƤy seĆ» raĆ”t coĆ¹ Ć­ch khi ngƶƓĆøi laƤp trƬnh chuĆ» ƱoƤĆÆng taĆÆo ra caĆ”u truĆ¹c dƶƵ lieƤu stack ƱaĆ«c duĆÆng cho tƶĆøng chƶƓng trƬnh con ƱeƤ quy cuĆÆ theĆ„ . PhaĆ n tieĆ p theo seĆ» trƬnh baĆøy vieƤc khƶƻ ƱeƤ quy moƤt soĆ” daĆÆng thuĆ» tuĆÆc ƱeƤ quy theo hĆ¶Ć“Ć¹ng thay giaĆ»i thuaƤt ƱeƤ quy baĆØng caĆ¹c voĆøng laĆ«p vaĆø moƤt caĆ”u truĆ¹c dƶƵ lieƤu kieĆ„u stack thĆ­ch hĆ“ĆÆp . b) ThuĆ» tuĆÆc ƱeƤ qui chi coĆ¹ moƤt leƤnh goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p . MoĆ¢ hƬnh toĆ„ng quaĆ¹t cuĆ»a thuĆ» tuĆÆc ƱeƤ quy chƦ coĆ¹ moƤt leƤnh goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p laĆø : P(X) ā‰” if C(X) then D(X) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 46. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 46 - else begin A(X) ; P(f(X)) ; B(X) ; end ; VĆ“Ć¹i : X laĆø moƤt bieĆ¹n ƱƓn hoaĆ«c bieĆ”n veĆ¹c tĆ“. C(X) laĆø moƤt bieĆ„u thĆ¶Ć¹c boolean cuĆ»a X . A(X) , B(X) , D(X) laĆø caĆ¹c nhoĆ¹m leƤnh khoĆ¢ng ƱeƤ quy ( khoĆ¢ng chĆ¶Ć¹a leƤnh goĆÆi ƱeĆ”n P ). f(X) laĆø haĆøm cuĆ»a X . TieĆ”n trƬnh thƶĆÆc hieƤn thuĆ» tuĆÆc P(X) seĆ» laĆø : + NeĆ”u C(X) ƱuĆ¹ng thƬ thƶĆÆc hieƤn D(X) . + CoĆøn khoĆ¢ng ( C(X) sai ) thƬ thƶĆÆc hieƤn A(X) ; goĆÆi P(f(X)) ; thƶĆÆc hieƤn B(X) . ( B(X) chƦ ƱƶƓĆÆc thƶĆÆc hieƤn khi P(f(X)) thƶĆÆc hieƤn xong ) . MoĆ£i laĆ n thaĆønh phaĆ n ƱeƤ quy P(Y) ƱƶƓĆÆc goĆÆi thƬ thoĆ¢ng tin giaĆ»i thuaƤt B(Y) laĆÆi ƱƶƓĆÆc sinh ra (nhƶng chƶa thƶĆÆc hieƤn ) . GƦa sƶƻ quĆ¹a trƬnh ƱeƤ quy keĆ”t thuĆ¹c sau k laĆ n goĆÆi ƱeƤ quy thƬ ta phaĆ»i thƶĆÆc hieƤn moƤt daƵy k thao taĆ¹c B theo thĆ¶Ć¹ tƶĆÆ : B(fk-1 (X)) , B(fk-2 (X)) , . . . ,B(f(f(X))) ,B(f(X)),B(X). ƑeĆ„ thƶĆÆc hieƤn daƵy thao taĆ¹c { B(fi (X)) } theo thĆ¶Ć¹ tƶĆÆ ngƶƓĆÆc vĆ“Ć¹i thĆ¶Ć¹ tƶĆÆ phaĆ¹t sinh ta caĆ n daƵy dƶƵ lieƤu {fi (X) } truy xuaĆ”t theo nguyeĆ¢n taĆ©c LIFO. Ta seĆ» duĆøng moƤt Stack ƱeĆ„ lƶu trƶƻ daƵy { fi (X) } ā‰” { X , f(X) , f(f(X)) , . . . , fi (X) , . . . , fk-1 (X) } TrƬnh tƶĆÆ thƶĆÆc hieƤn P(X) ƱƶƓĆÆc dieĆ£n taĆ» baĆØng moĆ¢ hƬnh sau : P(X) C(X) = False A(X) ; Push(S,X); U:=f(X) ; P(U) ; POP(S,U) ; B(U) ( U = X ) C(U) = False A(U) ; Push(S,U); U :=f(U)); P(U) ; POP(S,U) ; B(U) ( U = f(X)) C(U) = False A(U) ; Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U) ------------------------------------------------------------------------------------------------ C(U) = False A(U) ;------> Push(S,U) ; U : = f(U)); P(U ) ; POP(S,U) ; B(U) ( U=fk-1 (X) ) C(U) = True D(U ) TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 47. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 47 - GiaĆ»i thuaƤt thƶĆÆc hieƤn P(X) vĆ“Ć¹i vieƤc sƶƻ duĆÆng Stack coĆ¹ daĆÆng : P(X) ā‰” { Creat_Stack (S) ; ( taĆÆo stack S ) While(not(C(X)) do begin A(X) ; Push(S,X) ; ( caĆ”t gĆ­a trĆ² X vaĆøo stack S ) X := f(X) ; end ; D(X) ; While(not(EmptyS(S))) do begin POP(S,X) ; ( laĆ”y dƶƵ lieƤu tƶĆø S ) B(X) ; end ; } VĆ­ duĆÆ : ThuĆ» tuĆÆc ƱeƤ quy chuyeĆ„n bieĆ„u dieĆ£n soĆ” tƶĆø cĆ“ soĆ” thaƤp phaĆ¢n sang nhĆ² phaĆ¢n coĆ¹ daĆÆng : Binary(m) ā‰” if ( m > 0 ) then begin Binary( m div 2 ) ; write( m mod 2 ) ; end; Trong trƶƓĆøng hĆ“ĆÆp naĆøy : X laĆø m . P(X) laĆø Binary(m) . A(X) ; D(X) laĆø leƤnh roĆ£ng . B(X) laĆø leƤnh Write(m mod 2 ) ; C(X) laĆø ( m <= 0 ) . f(X) = f(m) = m div 2 . GiaĆ¹i thuaƤt thƶĆÆc hieƤn Binary(m) khoĆ¢ng ƱeƤ quy laĆø : Binary (m ) ā‰” { Creat_Stack (S) ; While ( m > 0 ) do begin sdu := m mod 2 ; Push(S,sdu) ; m := m div 2 ; end; While( not(EmptyS(S)) do begin POP(S,sdu) ; Write(sdu) ; end; } TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 48. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 48 - c) NhieĆ u leƤnh goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p. c1) ThuĆ» tuĆÆc ƱeƤ quy vĆ“Ć¹i 2 laĆ n goĆÆi trƶĆÆc tieĆ”p ThuĆ» tuĆÆc ƱeƤ quy 2 laĆ n goĆÆi trƶĆÆc tieĆ”p coĆ¹ daĆÆng : P(X) ā‰” if C(X) then D(X) else begin A(X) ; P(f(X)) ; B(X) ; P(g(X)) ; end ; QuĆ¹a trƬnh thƶĆÆc hieƤn thuĆ» tuĆÆc P(X) seĆ» laĆø : - NeĆ”u C(X) ƱuĆ¹ng thƬ thƶĆÆc hieƤn D(X) . - NeĆ”u C(X) sai thƬ thƶĆÆc hieƤn A(X) ; goĆÆi P(f(X)) ; thƶĆÆc hieƤn B(X) ; goĆÆi P(g(X)) , khi goĆÆi P(g(X)) thƬ laĆÆi phaĆ¹t sinh leƤnh A(g(X)) nhƶ vaƤy ngoaĆøi vieƤc phaĆ»i lƶu vaĆøo stack caĆ¹c gĆ­a trĆ² fi (X) ta con phaĆ»i lƶu vaĆøo stack caĆ¹c gĆ­a trĆ² gi (X) tƶƓng Ć¶Ć¹ng . Khi ta laĆ”y dƶƵ lieƤu tƶĆø stack ƱeĆ„ thƶĆÆc hieƤn leƤnh B(U) maĆø chƶa gaĆ«p ƱieĆ u kieƤn keĆ”t thuĆ¹c thƬ ta thƶĆÆc hieƤn P(g(U)) vaĆø laĆÆi phaĆ»i lƶu gĆ­a trĆ² g(U) vaĆøo stack ,... ƑieĆ u kieƤn dƶĆøng laĆø khi truy xuaĆ”t tĆ“Ć¹i phaĆ n tƶƻ lƶu ƱaĆ u tieĆ¢n trong stack . Nhƶ vaƤy laĆø ngoaĆøi dƶƵ lieƤu X , con phaĆ»i lƶu vaĆøo ngaĆŖn xeĆ”p theĆ¢m thĆ¶Ć¹ tƶĆÆ laĆ n goĆÆi ( cuĆÆm goĆÆi ) ThuaƤt toaĆ¹n khƶƻ ƱeƤ quy tƶƓng Ć¶Ć¹ng vĆ“Ć¹i thuĆ» tuĆÆc ƱeƤ quy P(X) laĆø : { Creat_Stact (S) : Push (S, (X,1)) ; Repeat While ( not C(X) ) do begin A(X) ; Push (S, (X,2)) ; X := f(X) ; end ; D(X) ; POP (S, (X,k)) ; if ( k <> 1) then begin B(X) ; X := g(X) ; end ; until ( k = 1 ) ; } TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 49. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 49 - VĆ­ duĆÆ : Khƶƻ ƱeƤ quy thuĆ» tuĆÆc ThaĆ¹p HaĆø NoƤi . + DaĆÆng ƱeƤ quy cuĆ»a thuĆ» tuĆÆc ThaĆ¹p HaĆø NoƤi laĆø : THN(n , X , Y, Z ) ā‰” if( n > 0 ) then begin THN ( n - 1 , X , Z , Y ) ; Move ( X , Z ) ; THN ( n - 1 , Y , X , Z ) ; end ; VĆ“Ć¹i n laĆø soĆ” Ć±Ć³a , X laĆø coƤt ƱaĆ u , Z laĆø coƤt cuoĆ”i , Y laĆø coƤt giƶƵa ,Move(X,Z) laĆø thao taĆ¹c chuyeĆ„n 1 Ć±Ć³a tƶĆø coƤt X tĆ“Ć¹i coƤt Z . Trong trƶƓĆøng hĆ“ĆÆp naĆøy : BieĆ”n X laĆø boƤ ( n , X , Y , Z ) . C(X) laĆø bieĆ„u thĆ¶Ć¹c boolean ( n < = 0 ) . D(X) , A(X) laĆø thao taĆ¹c roĆ£ng . B(X) = B(n,X,Y,Z) laĆø thao taĆ¹c Move(X,Z) ; f(X) = f(n ,X ,Y ,Z) = (n - 1 , X , Z , Y) . g(X) = g(n ,X , Y, Z ) = (n - 1 , Y ,X , Z ) . GiaĆ»i thuaƤt khoĆ¢ng ƱeƤ quy tƶƓng ƱƶƓng laĆø : { Creat_Stack (S) ; Push (S ,(n,X,Y,Z,1)) ; Repeat While ( n > 0 ) do begin Push (S ,(n,X,Y,Z,2)) ; n := n - 1 ; Swap (Y,Z ) ; (* Swap(a,b) laĆø thuĆ» tuĆÆc hoaĆ¹n end ; ƱoĆ„i noƤi dung 2 bieĆ”n a ,b *) POP (S,(n,X,Y,Z,k)) ; if ( k <> 1 ) then begin Move (X ,Z ) ; n := n - 1 ; Swap (X ,Y ) ; end ; until ( k = 1 ) ; } c2) TrƶƓĆøng hĆ“ĆÆp n laĆ n goĆÆi ƱeƤ quy trƶĆÆc tieĆ”p . ThuĆ» tuĆÆc ƱeƤ quy trong trƶƓĆøng hĆ“ĆÆp naĆøy coĆ¹ daĆÆng : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 50. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 50 - P(X) ā‰” if C(X) then D(X) else begin A1(X) ; P(f1(X)) ; A2(X) ; P(f2(X)) ; ............................ Ai(X) ; P(fi(X)) ; ............................ An(X) ; P(fn(X)) ; An+1(X) ; end ; CuƵng gioĆ”ng nhƶ trong trƶƓĆøng hĆ“ĆÆp (3a) laĆø khi quay trĆ“Ć» laĆÆi sau khi thƶĆÆc hieƤn moƤt laĆ n ƱeƤ quy, caĆ n bieĆ”t ƱoĆ¹ laĆø leƤnh goĆÆi thuoƤc nhoĆ¹m thĆ¶Ć¹ maĆ”y trong daƵy leƤnh goĆÆi ƱeĆ„ bieĆ”t thao taĆ¹c caĆ n thƶĆÆc hieƤn tieĆ”p. VƬ vaƤy trong choĆ ng caĆ n giƶƵ theĆ¢m vĆ² trĆ­ nhoĆ¹m leƤnh goĆÆi . DaĆÆng laĆ«p tƶƓng Ć¶Ć¹ng laĆø : { Creat_Stack (S) ; Push(S,(X,1)) ; Repeat While (not C(X) ) do begin A1(X) ; Push (S,(X,2)) ; X := f1(X) ; end ; D(X) ; POP(S,(X,k)) ; While( k = n+1 ) do begin An+1 ; POP(S,(X,k)) ; end ; if ( k > 0 ) then begin Ak(X) ; Push (S,(X,k+1)); X := f k (X) end ; until (k = 1 ) ; } VĆ­ duĆÆ : Khƶƻ ƱeƤ quy cho thuĆ» tuĆÆc hoaĆ¹n vĆ² . + ThuĆ» tuĆÆc hoaĆ¹n vĆ² dĆ¶Ć“Ć¹i daĆÆng ƱeƤ quy : TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 51. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 51 - HVI(V ,n) ā‰” if (n = 1 ) then Print ( V ) else for i := n downto 1 do begin Swap (V[n],V[i] ) ; HVI(V ,n - 1) : end ; trong trƶƓĆøng hĆ“ĆÆp naĆøy thƬ : X laĆø boƤ (V ,n ) . (* vector V vaĆø soĆ” nguyeĆ¢n n *) C(X) laĆø ( n = 1 ) . D(X) laĆø Print (V) . (* xuaĆ”t vector V *) Ai(X) laĆø thuĆ» tuĆÆc Swap(V[n] ,V[i] ) ( i = 1 .. n ) . An+1 laĆø thao taĆ¹c roĆ£ng . fi(X) = f(V, n ) = ( V, n - 1) .( vĆ“Ć¹i i = 1 . . n ) DaĆÆng laĆ«p cuĆ»a thuĆ» tuĆÆc laĆø : { Creat_Stack (S) ; Push (S,(V ,n ,1)) ; Repeat While ( n > 1 ) do begin Swap(V[n] ,V[1] ; Push (S ,V , n ,2) ; n := n -1 ; end ; Print (V) ; POP (S ,(V ,n ,k)) ; While ( k = n +1 ) do POP(S ,(V ,n ,k) ; if(k <> 1 ) then begin Swap(V[n] ,V[k]) ; Push (S ,(V ,n ,k+1) ; n := n - 1 ; end ; until(k = 1 ) ; TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin
  • 52. KyƵ thuaƤt laƤp trƬnh naĆ¢ng cao - 52 - PHAƀN II KIEƅM CHƖƙNG CHƖƔNG TRƌNH CHƖƔNG IV CAƙC KHAƙI NIEƄM I. CAƙC GIAI ƑOAƏN TRONG CUOƄC SOƁNG CUƛA MOƄT PHAƀN MEƀM VieƤc sƶƻ duĆÆng maĆ¹y tĆ­nh ƱeĆ„ giaĆ»i moƤt baĆøi toaĆ¹n thƶĆÆc teĆ” thƶƓĆøng bao goĆ m nhieĆ u vieƤc. Trong caĆ¹c coĆ¢ng vieƤc ƱoĆ¹ coĆ¢ng vieƤc maĆø ngƶƓĆøi ta quan taĆ¢m nhaĆ”t laĆø vieƤc xaĆ¢y dƶĆÆng caĆ¹c heƤ thoĆ”ng phaĆ n meĆ m (caĆ¹c heƤ thoĆ”ng chƶƓng trƬnh giaĆ»i baĆøi toaĆ¹n ). ƑeĆ„ xaĆ¢y dƶĆÆng moƤt heƤ thoĆ”ng phaĆ n meĆ m , ngƶƓĆøi ta thƶƓĆøng thƶĆÆc hieƤn trƬnh tƶĆÆ caĆ¹c coĆ¢ng vieƤc sau : ƑaĆ«c taĆ» baĆøi toaĆ¹n, xaĆ¢y dƶĆÆng heƤ thoĆ”ng, sƶƻ duĆÆng vaĆø baĆ»o trƬ. 1) ƑaĆ«c taĆ» baĆøi toaĆ¹n GoĆ m vieƤc phaĆ¢n tĆ­ch ƱeĆ„ naĆ©m baĆ©t roƵ yeĆ¢u caĆ u cuĆ»a baĆøi toaĆ¹n vaĆø dieĆ£n ƱaĆÆt chĆ­nh xaĆ¹c laĆÆi baĆøi toaĆ¹n baĆØng ngoĆ¢n ngƶƵ thĆ­ch hĆ“ĆÆp vƶĆøa thĆ­ch Ć¶Ć¹ng vĆ“Ć¹i chuyeĆ¢n ngaĆønh tin hoĆÆc vƶĆøa coĆ¹ tĆ­nh ƱaĆÆi chuĆ¹ng ( deĆ£ hieĆ„u ƱoĆ”i vĆ“Ć¹i nhieĆ u ngƶƓĆøi). 2) XaĆ¢y dƶĆÆng heƤ thoĆ”ng Trong bĆ¶Ć“Ć¹c naĆøy seĆ» tuaĆ n tƶĆÆ thƶĆÆc hieƤn caĆ¹c coĆ¢ng vieƤc sau : - ThieĆ”t keĆ” : XaĆ¢y dƶĆÆng moĆ¢ hƬnh heƤ thoĆ”ng phaĆ n meĆ m caĆ n coĆ¹. Trong bĆ¶Ć“Ć¹c naĆøy, coĆ¢ng vieƤc chuĆ» yeĆ”u laĆø phaĆ¢n chia heƤ thoĆ”ng thaĆønh caĆ¹c module chĆ¶Ć¹c naĆŖng vaĆø xaĆ¹c Ć±Ć²nh roƵ chĆ¶Ć¹c naĆŖng cuĆ»a tƶĆøng module cuƵng nhƶ moĆ”i tƶƓng taĆ¹c giƶƵa caĆ¹c module vĆ“Ć¹i nhau. ChĆ¶Ć¹c naĆŖng cuĆ»a moĆ£i module ƱƶƓĆÆc Ć±Ć²nh roƵ bĆ“Ć»i ƱaĆ«c taĆ» cuĆ»a tƶĆøng module tƶƓng Ć¶Ć¹ng. - TrieĆ„n khai tƶĆøng module vaĆø thƶƻ nghieƤm : VieĆ”t chƶƓng trƬnh cho tƶĆøng module (baĆøi toaĆ¹n con) thoĆ»a "ƱuĆ¹ng" ƱaĆ«c taĆ» ƱaƵ ƱaĆ«t ra. TĆ­nh ƱuĆ¹ng cuĆ»a chƶƓng trĆ­nh ƱƶƓĆÆc quan taĆ¢m baĆØng 2 hĆ¶Ć“Ć¹ng khaĆ¹c nhau : + ChĆ¶Ć¹ng minh tĆ­nh ƱuĆ¹ng moƤt caĆ¹ch hƬnh thĆ¶Ć¹c (thƶƓĆøng laĆø moƤt coĆ¢ng vieƤc khoĆ¹ khaĆŖn) . + ChaĆÆy thƶƻ chƶƓng trƬnh treĆ¢n nhieĆ u boƤ dƶƵ lieƤu thƶƻ khaĆ¹c nhau moĆ£i boƤ dƶƵ lieƤu ƱaĆÆi dieƤn cho moƤt lĆ“Ć¹p dƶƵ lieƤu (thƶƓĆøng laĆø moƤt coĆ¢ng vieƤc toĆ”n keĆ¹m ). ƑeĆ„ coĆ¹ tĆ­nh thuyeĆ”t phuĆÆc cao, ngƶƓĆøi ta caĆ n chaĆÆy thƶƻ treĆ¢n caĆøng nhieĆ u boƤ dƶƵ lieƤu caĆøng toĆ”t. Khi thƶƻ neĆ”u phaĆ¹t hieƤn sai thƬ phaĆ»i sƶƻa laĆÆi chƶƓng trƬnh coĆøn chƶa phaĆ¹t hieƤn sai thƬ ta con taĆÆm tin chƶƓng trƬnh ƱuĆ¹ng (chaĆÆy thƶƻ chƦ coĆ¹ taĆ¹c duĆÆng phaĆ¹t hieƤn sai vaĆø taĆŖng loĆøng tin vaĆøo tĆ­nh ƱuĆ¹ng chĆ¶Ć¹ khoĆ¢ng chĆ¶Ć¹ng minh ƱƶƓĆÆc tĆ­nh ƱuĆ¹ng ). TraĆ n HoaĆøng ThoĆÆ Khoa ToaĆ¹n - Tin