More Related Content Similar to Kythuatlaptrinh
Similar to Kythuatlaptrinh (20) More from VƵ TĆ¢m Long (20) Kythuatlaptrinh1. 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