Professional Documents
Culture Documents
Lp trnh hm
Mc lc
CHNG I. NGUYN L LP TRNH HM ......................................................... 1
I.1
I.1.1.
I.1.2.
I.1.3.
I.1.4.
I.1.5.
I.2
I.2.1.
I.2.2.
I.2.3.
I.2.4.
I.2.5.
I.2.6.
I.2.7.
I.2.8.
I.2.9.
1.
2.
3.
4.
I.3
ii
LP TRNH HM
II.3.3.
II.3.3.1.
II.3.3.2.
1.
2.
3.
II.3.3.3.
II.3.4.
II.3.4.1.
II.3.4.2.
1.
2.
3.
4.
II.3.4.3.
II.3.4.4.
II.3.4.5.
II.3.5.
1.
2.
3.
Cu trc iu khin................................................................................. 45
Dng iu kin if .................................................................................... 45
Bin cc b............................................................................................. 47
nh ngha bin cc b nh dng let ...................................................... 47
Phm vi t ng ca dng let ................................................................. 48
Lin kt bin theo dy : dng let* ........................................................... 48
nh ngha cc v t................................................................................ 49
S quy v s lp....................................................................... 50
S quy........................................................................................... 50
V d ...................................................................................................... 51
Tnh tng bnh phng cc s t 1 n n ................................................ 51
Tnh giai tha......................................................................................... 51
Hm fibonacci ........................................................................................ 51
Tnh cc h s nh thc........................................................................... 52
Tnh dng ca li gi quy .................................................................. 52
Chng minh tnh dng............................................................................ 54
S lp ................................................................................................ 54
Vo/ra d liu......................................................................................... 56
c vo d liu : read............................................................................ 56
In ra d liu : write v display................................................................ 56
Xy dng vng lp c menu.................................................................... 57
MC LC
iii
7.
Lp danh sch cc s nguyn t ............................................................. 88
III.4.2.5. K thut quy x l danh sch bt k................................................... 89
1.
Lm phng mt danh sch ...................................................................... 89
2.
Tnh tng cc s c mt trong danh sch ................................................ 90
3.
Loi b khi danh sch mt phn t cc mc khc nhau ..................... 90
4.
Nghch o danh sch ............................................................................ 90
5.
So snh bng nhau ................................................................................. 91
III.4.3.
Biu din danh sch................................................................................ 92
III.4.3.1. Biu din danh sch bi kiu b i........................................................ 92
III.4.3.2. Danh sch kt hp .................................................................................. 96
1.
Khi nim danh sch kt hp.................................................................. 96
2.
S dng danh sch kt hp ..................................................................... 97
III.4.3.3. Dng quasiquote ..................................................................................... 98
III.4.4.
Mt s v d ng dng danh sch ........................................................... 99
1.
Tm phn t cui cng ca danh sch..................................................... 99
2.
Lit k cc v tr mt k hiu c trong danh sch................................... 100
3.
Tm tng con ln nht trong mt vector ................................................ 100
4.
Bi ton sp xp dy vin bi ba mu..................................................... 101
5.
Sp xp nhanh quicksort....................................................................... 102
CHNG IV. K THUT X L HM.............................................................. 107
IV.1
IV.1.1.
IV.1.2.
IV.1.3.
IV.2
IV.2.1.
IV.2.2.
IV.2.3.
IV.2.4.
IV.2.5.
1.
2.
3.
4.
5.
IV.2.6.
IV.2.7.
IV.3
IV.3.1.
1.
2.
3.
IV.3.2.
IV.3.3.
IV.3.4.
IV.4
IV.4.1.
IV.4.2.
iv
LP TRNH HM
IV.4.3.
X l a thc........................................................................................ 134
IV.4.3.1. nh ngha a thc ............................................................................... 134
IV.4.3.2. Biu din a thc.................................................................................. 134
IV.4.3.3. X l a thc........................................................................................ 135
1.
Nhn a thc vi mt hng s .............................................................. 135
2.
So snh hai a thc .............................................................................. 136
3.
Php cng a thc................................................................................ 136
4.
Php nhn hai a thc.......................................................................... 137
IV.4.3.4. Biu din trong mt a thc.................................................................. 137
IV.4.3.5. a ra a thc ...................................................................................... 138
IV.4.4.
Thut ton quay lui............................................................................... 139
IV.4.4.1. Bi ton tm qun hu .......................................................................... 139
IV.4.4.2. Tm kim cc li gii ............................................................................ 140
IV.4.4.3. T chc cc li gii .............................................................................. 143
CHNG V. CU TRC D LIU .................................................................... 147
V.1
V.2
V.2.1.
V.2.2.
V.2.3.
V.2.4.
V.2.5.
Tp hp............................................................................................... 147
Php hp trn cc tp hp.................................................................... 148
Php giao trn cc tp hp................................................................... 149
Php hiu ca hai tp hp .................................................................... 149
Tm cc tp hp con ca mt tp hp ................................................... 150
Ngn xp ............................................................................................. 150
Kiu d liu tru tng ngn xp ......................................................... 150
Xy dng ngn xp............................................................................... 151
Xy dng trnh son tho vn bn......................................................... 152
Ngn xp t bin ................................................................................ 153
Tnh biu thc s hc dng hu t ........................................................ 156
V.3
V.3.1.
V.3.2.
V.3.3.
Tp ...................................................................................................... 158
Cu trc d liu tru tng kiu tp ..................................................... 158
V d p dng tp ................................................................................. 159
Tp t bin ......................................................................................... 160
V.4
V.4.1.
V.4.1.1.
V.4.1.2.
1.
2.
3.
V.4.1.3.
1.
2.
V.4.1.4.
V.4.2.
V.4.2.1.
V.4.2.2.
1.
2.
V.4.2.3.
Cy...................................................................................................... 162
Cy nh phn ........................................................................................ 163
Kiu tru tng cy nh phn................................................................ 163
Biu din cy nh phn.......................................................................... 164
Biu din tit kim s dng hai php cons............................................. 164
Biu din dng y .......................................................................... 165
Biu din n gin ............................................................................... 165
Mt s v d lp trnh n gin ............................................................. 166
m s lng cc nt c trong mt cy................................................ 166
Tnh cao ca mt cy....................................................................... 166
Duyt cy nh phn ............................................................................... 167
Cu trc cy tng qut .......................................................................... 169
Kiu tru tng cy tng qut............................................................... 169
Biu din cy tng qut ........................................................................ 169
Biu din cy nh mt b i................................................................ 169
Biu din cy n gin qua cc l ........................................................ 170
Mt s v d v cy tng qut ............................................................... 170
1.
2.
3.
4.
MC LC
1.
2.
V.4.2.4.
V.4.3.
V.4.3.1.
V.4.3.2.
LI NI U
Chng 1 gii thiu qu trnh pht trin v phn loi cc ngn ng lp trnh, nhng
c im c bn ca phong cch lp trnh mnh lnh. Phn chnh ca chng
trnh by nhngnguyn l lp trnh hm s dng ngn ng minh ho Miranda.
Chng 4 trnh by nhng kin thc nng cao v k thut lp trnh hm, nh ngha
hm nh php tnh lambda, ng dng thut ton quay lui, truyn thng ip...
Chng 5 trnh by chi tit hn k thut lp trnh nng cao vi Scheme s dng cc
cu trc d liu : tp hp, ngn xp, hng i, cy v tp.
Chng 6 trnh by khi nim mi trng, cch t chc v cp pht b nh, cch
vo/ra d liu ca Scheme vi th gii bn ngoi.
Cun sch ny lm ti liu t kho cho sinh vin cc ngnh cng ngh thng tin v
nhng bn c mun tm hiu thm v k thut lp trnh cho lnh vc tr tu nhn to,
giao tip h thng, x l k hiu, tnh ton hnh thc, cc h thng ho...
Trong sut qu trnh bin son, tc gi nhn c t cc bn ng nghip nhiu
ng gp b ch v mt chuyn mn, nhng ng vin khch l v mt tinh thn, s gip
tn tnh v bin tp cun sch c ra i. Do mi xut bn ln u tin, ti liu tham
kho ch yu l ting nc ngoi, chc chn rng ni dung ca cun sch vn cn bc l
nhiu thiu st, nht l cc thut ng dch ra ting Vit.
Tc gi xin c by t y lng bit n su sc v mi kin ph bnh ng gp ca
bn c gn xa.
Nng, ngy 06/09/2004
Tc gi.
L P
T R N H
HM
Functional Programming
p trnh hm l phong cch lp trnh da trn nh ngha hm s dng php tnh lambda
(-calculus). Lp trnh hm khng s dng cc lnh gn bin v khng gy ra hiu ng
ph nh vn gp trong lp trnh mnh lnh. Trong cc ngn ng lp trnh hm, hm (th tc,
chng trnh con) ng vai tr trung tm, thay v thc hin lnh, my tnh tnh biu thc. c
rt nhiu ngn ng hm c pht trin v ng dng nh Miranda, Haskell, ML, cc ngn ng
h Lisp : Scheme, Common Lisp...
Phn u cun sch ny trnh by c s l thuyt v nhng khi nim c bn ca
lp trnh hm s dng ngn ng minh ho l Miranda, mt ngn ng thun tu hm
do D. Turner xut 1986. Phn chnh trnh by k thut lp trnh hm trong Scheme,
mt ngn ng do Guy Lewis Steele Jr. v G. Jay Sussman xut 1975.
Ngn ng Scheme c tnh s phm cao, gii quyt thch hp cc bi ton ton hc v
x l k hiu. Scheme c c php n gin, d hc, d lp trnh. Mt chng trnh Scheme l
mt dy cc nh ngha hm gp li nh ngha mt hoc nhiu hm phc tp hn. Scheme
lm vic theo ch thng dch, tng tc vi ngi s dng.
Cun sch ny rt thch hp cho sinh vin cc ngnh cng ngh thng tin v
nhng bn c mun tm hiu v k thut lp trnh ng dng trong lnh vc tr tu
nhn to, giao tip ngi-h thng, x l k hiu, tnh ton hnh thc, thit k cc
h thng ho...
V TC GI :
Tt nghip ngnh Ton My tnh nm 1979 ti trng i hc Bch khoa H Ni.
T 1979 n nay ging dy ti khoa Cng ngh Thng tin, trng i hc Bch khoa,
i hc Nng. Bo v tin s nm 1991 ti Php. Gi chc ch nhim khoa
Cng ngh Thng tin 1995-2000.
Hng nghin cu chnh : x l ngn ng, x l a ng, l thuyt tnh ton.
E-mail: phanhuykhanh@dng.vnn.vn
PH LC
203
PH LC WINSCHEME48
204
xem ti liu hng dn, NSD gi chy chng trnh scheme48.chm c sn trong
th mc ..\Scheme48\doc c t ng to ra sau khi ci t (xem hnh 2).
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
205
CHNG I.
NGUYN L LP TRNH HM
I.1
M u v ngn ng lp trnh
I.1.1. Vi nt v lch s
Bui ban u
LP TRNH HM
Hng (constants) : 2
Php ton (operators) : + , :=
Du phn cch (delimiters) : :, (, ), ...
NGUYN L LP TRNH HM
3. C php (syntax)
C php quy nh cch thc kt hp cc k t thnh t, kt hp cc t thnh cu lnh
ng (statement hay instruction), kt hp cc cu lnh ng thnh mt chng trnh hon
chnh v mt vn phm. C th hnh dung cch kt hp ny ging cch t cu trong mt
ngn ng t nhin. Thng ngi ta dng s c php (syntax diagram) hoc dng chun
Backus-Naur (Backus-Naur Form, vit tt BNF), hoc dng chun Backus-Naur m rng
(EBNF Extended Backus-Naur Form) m t c php ca vn phm.
V d I.1.1 : Trong ngn ng Pascal (hoc trong phn ln cc ngn ng lp trnh), tn gi,
hay nh danh (identifier) c s c php nh sau :
tn
s
ch
ch
s
ch
A ... Z
a ...
... 9
a ...
c nh ngha l
chui ca 0 hay nhiu mc lit k tu chn (option)
hoc 0 hoc 1 mc lit k tu chn
mc lit k phi c thay th
hoc (theo ngha loi tr)
LP TRNH HM
<loop>
::=
while <expression> do <statement>+ done
<expression> ::=
<value> | <value> + <value> | <value> <= <value>
<value>
::= <identifier> | <number>
<identifier> ::=
<letter>|<identifier><letter>|<identifier><digit>
<number>
::= <digit> | <number><digit>
<letter>
::= A | ... | Z | a | ... | z
<digit>
::= 0 | ... | 9
Mt cu, tc l mt chng trnh n gin, vit trong vn phm trn nh sau :
program
n := 1 ;
while n <= 10 do n := n + 1 ; done
end
4. Ng ngha (semantic)
Cn c vo c php ca ngn ng lp trnh, ngi lp trnh vit chng trnh gm cc cu
lnh theo trnh t cho php gii quyt c bi ton ca mnh. t c mc ch ,
mi cu lnh vit ra khng nhng ng n v mt c php, m cn phi ng n c v mt
ng ngha, hay ngha logic ca cu lnh. Tnh ng n v mt ng ngha cho php gii
quyt c bi ton, chng trnh chy lun lun dng, n nh v cho kt qu ph hp vi
yu cu t ra ban u.
NGUYN L LP TRNH HM
Lnh
S dng b nh
Lnh my n gin
Truy cp v cp pht trc tip
Biu thc v iu khin Truy cp v cp pht nh cc php
tng minh
ton, chng hn new
Truy cp n v t ng cp pht
V d
Hp ng, Autocode
FORTRAN, ALGOL,
Pascal, C, Ada
SELT, Prolog,
Miranda
Th tc
Hng
X l
i tng song song
Khai bo
Lgic
Hm
C s
d liu
LP TRNH HM
Vic phn loi cc ngn ng lp trnh theo mc quan trng l da trn ci g (what) s
thao tc c (achieved), hay tnh c (computed), so vi cch thao tc nh th no (how).
Mt ngn ng th hin ci g s thao tc c m khng ch ra cch thao tc nh th no
c gi l ngn ng nh ngha (definitional) hay khai bo (declarative). Mt ngn ng th
hin cch thao tc nh th no m khng ch ra ci g s thao tc c gi l ngn ng thao
tc (operational) hay khng khai bo (non-declarative), l cc ngn ng mnh lnh.
NGUYN L LP TRNH HM
integer
Tn bin
Kiu :
tp hp gi tr
..., 1, 0, 1, ...
tp hp php ton
+, , , /, ...
cu trc lu tr
bit 14 13
2
2
du
. . .
22
21
20
Mc
ngn ng
Mc
chng
trnh
dch
S
5
...
Mc
my
Hnh I.5. Quan h gia tn bin, kiu v gi tr trong ngn ng mnh lnh
Hnh I.5. minh ha cch khai bo d liu trong cc ngn ng mnh lnh v cc mi quan
h theo mc. Ngi ta phn bit ba mc nh sau : mc ngn ng lin quan n tn bin, tn
kiu d liu v cu trc lu tr ; mc chng trnh dch lin quan n phng php t chc
b nh v mc my cho bit cch biu din theo bit v gi tr d liu tng ng. Mi khai
bo bin, v d int i, ni kt (bind) tn bin (i) vi mt cu trc c trng bi tn kiu
(int) v vi mt gi tr d liu c biu din theo bit nh lnh gn i := 5 (hoc nh mt
lnh va khai bo va khi gn int i=5). T hp tn, kiu v gi tr to nn c trng
ca bin.
Cc ngn ng mnh lnh c s dng hiu qu trong lp trnh do ngi lp trnh c th
tc ng trc tip vo phn cng. Tuy nhin, tnh thc dng mnh lnh lm hn ch tr tu
ca ngi lp trnh do phi ph thuc vo cu trc vt l ca my tnh. Ngi lp trnh lun
c khuynh hng suy ngh v nhng v tr lu tr d liu c t tn (nguyn tc a ch
ho) m ni dung ca chng thng xuyn b thay i. Thc t c rt nhiu bi ton cn s
tru tng ho khi gii quyt (ngha l khng ph thuc vo cu trc vt l ca my tnh),
khng nhng i hi tnh thnh tho ca ngi lp trnh, m cn i hi kin thc Ton hc
tt v kh nng tru tng ho ca h.
T nhng l do trn m ngi ta tm cch pht trin nhng m hnh tng tc khng phn
nh mi quan h vi phn cng ca my tnh, m lm d dng lp trnh. tng ca m hnh
l ngi lp trnh cn c t ci g s c tnh ton m khng phi m t cch tnh nh th
no. S khc nhau gia nh th no v ci g, cng nh s khc nhau gia cc ngn ng
LP TRNH HM
mnh lnh v cc ngn ng khai bo, khng phi lun lun r rng. Cc ngn ng khai bo
thng kh ci t v kh vn hnh hn cc ngn ng mnh lnh. Cc ngn ng mnh lnh
thng gn gi ngi lp trnh hn.
Sau y l mt s c trng ca ngn ng lp trnh mnh lnh :
S dng nguyn l tinh ch tng bc hay lm mn dn, x l ln lt cc i tng
d liu c t tn.
Khai bo d liu ni kt mt tn bin c khai bo vi mt kiu d liu v mt
gi tr. Phm vi hot ng (scope) ca cc bin trong chng trnh c xc nh bi
cc khai bo, hoc ton cc (global), hoc cc b (local).
Cc kiu d liu c bn thng dng l s nguyn, s thc, k t v lgic. Cc kiu mi
c xy dng nh cc kiu cu trc. V d kiu mng, kiu bn ghi, kiu tp hp,
kiu lit k,...
Hai kiu d liu c cng tn th tng ng vi nhau, hai cu trc d liu l tng
ng nu c cng gi tr v c cng php ton x l.
Trng thi trong (b nh v thanh ghi) b thay i bi cc lnh gn. Trng thi ngoi
(thit b ngoi vi) b thay i bi cc lnh vo-ra. Gi tr c tnh t cc biu thc.
Cc cu trc iu khin l tun t, chn la (r nhnh), lp v gi chng trnh con.
Chng trnh con thng c hai dng : dng th tc (procedure) v dng hm
(function). S khc nhau ch yu l hm lun tr v mt gi tr, cn th tc th khng
khng nht thit tr v gi tr. Vic trao i tham bin (parameter passing) vi chng
trnh con hoc theo tr (by value) v theo tham chiu (by reference).
S dng chng trnh con thng gy ra hiu ng ph (side effect) do c th lm thay
i bin ton cc.
Mt chng trnh c xy dng theo bn mc : khi (block), chng trinh con, n
th (module/packages) v chng trnh.
I.2
C s ca cc ngn ng hm
NGUYN L LP TRNH HM
Ada l ngn ng lp trnh bc cao c pht trin nm 1983 bi B Quc phng M (US Department of
Defense), cn gi l Ada 83, sau c pht trin bi Barnes nm 1994, gi l Ada 9X. Ngn ng Ada ly tn
ca nh n Ton hc ngi Anh, Ada Augusta Lovelace, con gi ca nh th Lord Byron (17881824). Ngi
ta tn vinh b l ngi lp trnh u tin.
10
LP TRNH HM
NGUYN L LP TRNH HM
11
Tm li, ngn ng hm da trn vic tnh gi tr ca biu thc. Cc bin ton cc v php
gn b loi b, gi tr c tnh bi mt hm ch ph thuc vo cc tham i. Thng tin trng
thi c a ra tng minh, nh cc tham i ca hm v kt qu.
Sau y ta s xt nhng khi nim c coi l c bn nht trong cc ngn ng hm : hm
(function), danh sch (lists), kiu (type), tnh a kiu (polymorphism), cc hm bc cao
(higherorder functions), tham i ha tng phn (Currying), tnh hm theo kiu khn
ngoan2 (lazy evaluation), phng trnh (equations), so khp (patterm matching).
Cc hm quy (recursive functions) l mt trong nhng khi nim chnh trong ngn ng
hm. Cc hm bc cao v phng php tnh hm theo kiu khn ngoan to th mnh cho lp
trnh hm v ng vai tr quan trng trong vic xy dng cc chng trnh hm dng n th
(modular functional programs). Tnh a kiu b sung tnh mm do cho h thng nh kiu.
Trc khi tm hiu ngn ng Scheme bt u t chng 2, cun sch s dng ngn ng
Miranda trnh by nhng khi nim c bn ca lp trnh hm. Miranda l mt ngn ng
hm c c php d c, d hiu do David Turner pht trin nm 1986. c im ca Miranda
l thun tu hm (purely functional), khng xy ra hiu ng ph. Mt chng trnh Miranda,
c gi l mt script, l mt tp hp cc phng trnh (equation) c nh ngha theo
mt th t tu no (ni chung th t khng quan trng).
Trnh thng dch Miranda chy ch tng tc trong h iu hnh Unix. Sau y, chng
ti khng trnh by y c php ca Miranda m ch qua cc v d ca Miranda minh
ho cc yu t thun tu hm ca lp trnh hm.
V d sau y la mt chng trnh Miranda n gin. Ch cp k hiu || bt u
mt dng ch thch ca Miranda.
z = sq x / sq y
sq n = n * n
x = a + b
y = a - b
a = 10
b = 5
|| z = sq(x)/sq(y) = x2/y2
|| sq(n) = n2
I.2.2. nh ngha hm
Hm l khi nim c bn trong cc ngn ng hm. Mt hm c th nhn t khng n
nhiu tham i vo tnh ton v tr v mt gi tr, gi tr ny ch ph thuc vo cc tham
i nhn m thi.
Trong Miranda, mt hm c nh ngha bi hai phn : phn khai bo v phn nh
ngha hm. Phn khai bo c th vng mt c dng mt nguyn mu hm :
<tn hm> :: <min xc nh> -> <min gi tr>
Phn nh ngha hm c dng mt phng trnh, gm v tri v mt s v phi, mi v
phi c th c mt iu kin ng vai tr lnh gc (guard) phn bit ng cui :
<tn hm> [ <danh sch tham i> ] = <biu thc> [ <iu kin> ]
V d hm i nhit t Fahrenheit (F) sang Celsius (C) c nh ngha trong
Miranda nh sau :
celsius :: num > num
|| khai bo kiu hm
celsius f = (f 32)*5/9
|| i t Fahrenheit sang Celsius
2
Trong cun sch c nhiu thut ng ting Vit do tc gi t dch t ting Anh.
12
LP TRNH HM
= gcd (a-b) b,
= gcd a (b-a),
= a,
if a > b
if a < b
if a=b
|| hoc otherwise
|| fac 0 = 1
|| li gi quy
NGUYN L LP TRNH HM
13
quadsolve a b c
= error "complex roots",
if delta<0
= [-b/(2*a)],
if delta=0
= [-b/(2*a)] + radix/(2*a),
= [ -b/(2*a) - radix/(2*a)],
where delta = b*b - 4*a*c and radix = sqrt delta
Mnh ca Miranda c th lng nhau (nested) nhiu mc.
if delt
14
LP TRNH HM
NGUYN L LP TRNH HM
length L = 0, if L = []
15
16
LP TRNH HM
NGUYN L LP TRNH HM
17
18
LP TRNH HM
NGUYN L LP TRNH HM
19
foldr op k [] = k
foldr op k (a:L) = op a (foldr op k L)
Li gi hm foldr :
foldr (+) 0 [2, 4, 7]
tng ng vi :
(2 + (4 + (7 + 0)))
--> 13
Ch cc php ton trung t trong ngn ng Miranda, nh php cng + trn y, c
xem l tham i v phi c t trong mt cp du ngoc.
Ta c th nh ngha cc hm x l danh sch s dng hm foldr. Chng hn hm tnh
tng tt c cc phn t ca mt danh sch theo kiu currying nh sau :
sumlist = foldr (+) 0
Hm sumlist c mt tham i l danh sch s cung cp ba tham i cho hm foldr
nhng kt qu l do hm op c mt tham i tr v.
sumlist [2, 9, 52]
--> foldr (+) 0 [2, 9, 52]
--> 63
Mt cch tng t ta nh ngha hm tnh tch ca tt c cc phn t trong mt danh
sch :
product = foldr (*) 1
Hm :
and = foldr (&) true
gi php v lgch cho tt c cc phn t ca mt danh sch. Kt qu php gi hm and
L l true nu mi phn t ca danh sch L u l true, kt qu l false nu ngc li.
Hm nghch o mt danh sch :
reverse = foldr postfix []
where postfix a L = L ++ [a]
Cc ngn ng hm c nhiu hm bc cao tin nh, v ngi lp trnh cng c th t nh
ngha nhng hm bc cao mnh v tng qut nh hm foldr va xt.
Mt hm bc cao quan trng khc l map f L vi f l mt hm v L l mt danh sch.
Hm map tr v kt qu l mt danh sch mi gm cc phn t ca L c p dng cho
hm f. V d :
map triple [1, 2, 3, 4]
--> [triple 1, triple 2, triple 3, triple 4]
--> [3, 6, 9, 12]
Hm map gi triple cho tt c cc phn t ca danh sch [1, 2, 3, 4], tr v
danh sch cc s nguyn c nhn ba l [3, 6, 9, 12].
20
LP TRNH HM
NGUYN L LP TRNH HM
21
th b kim tra kiu s suy ra rng x phi l mt s, v x l mt tha s trong mt php nhn.
B kim tra kiu cng suy ra c rng kt qu ca triple x phi l mt s, do kiu
ca hm ny phi l :
triple :: num > num
Tnh a kiu l yu t rt quan trng trong nhiu ngn ng hm. Vi mi tham bin hnh
thc (formal parameters), mt hm a kiu c th chp nhn li gi tng ng vi nhiu
tham i thc s (actual parameters) c cc kiu khc nhau. Khc vi cc th tc trong Ada,
mt hm a kiu l mt hm n (single function), khng phi l cc hm bi (multiple
functions) c cng tn. V d xt hm a kiu pair sau y tr v mt danh sch t hai tham
i l hai phn t :
pair x y = [x, y]
Hm ny c th c s dng nh sau :
pair 1 2
--> [1, 2]
pair true false
--> [true, false]
pair [] [2]
--> [[], [2]]
Hm pair c nh ngha n, nhng c th s dng nhiu kiu tham i khc nhau,
nh bool, num, [num], v.v..., sao cho c hai tham i u phi c cng mt kiu. Nh vy,
kiu ca hm pair khng th c din t nh kiu ca hm triple va nh ngha
trn, v rng cc kiu ca cc tham i trong pair l khng c nh. Ngi ta a ra gii
php s dng cc bin kiu c th (generic type variables). Bn trong mt khai bo kiu,
mt bin kiu c th ch nh mt kiu no , cng mt bin kiu cho php ch nh cng
mt kiu xuyn sut c khai bo.
Miranda s dng cc k hiu *, **, *** ch nh kiu tu . V d hm ng nht id
(identity) c nh ngha nh sau :
id x = x
Hm id c khai bo kiu nh sau :
id :: * -> *
c ngha l id c nhiu kiu. Sau y l mt s khai bo kiu ca cc hm c nh
ngha trn y :
fac :: num -> num
ack :: num -> num-> num
sum :: [num] -> num
month :: [char] -> bool
reverse :: [*] -> [*]
fst :: (*, **) -> *
snd :: (*, **)-> **
foldr :: (*-> ** -> **) -> ** -> [*] -> **
perms :: [*] -> [[*]]
22
LP TRNH HM
Cc quy tc nh ngha kiu nh trn lm trnh c sai st khi s dng hm khng ng,
chng hn :
pair 1 true
5 + (pair 1 2)
NGUYN L LP TRNH HM
23
cond true x y = x
cond false x y = y
Nu c ba tham i ca cond c tnh gi tr trc khi hm cond c thc hin, th
s xy ra hai trng hp :
Mt trong cc tham i ca cond tham gia tnh ton mt cch v ch, dn n kt qu
sai, chng hn cond (x=0) 0 (1/x) vi x=0.
Nu vic tnh ton biu thc tham i l v ch v khng kt thc th s gy ra ton b
biu thc b tnh lp v hn ln.
Trng hp th hai c th c minh ha qua v d sau : gi s ta cng s dng hm
cond cho mt nh ngha khc ca hm fac :
fac n = cond (n = 0) 1 (n * fac (n - 1))
Nu tham i th ba ca cond lun lun c tnh, th hm fac s khng bao gi dng.
Bi v li gi fac 1 ko theo li gi fac 0, li gi fac 0 s ko theo li gi fac 1
v c th tip tc.
Nhng vn trn dn n khi nim tnh gi tr theo kiu khn ngoan trong lp trnh
hm s dng php rt gn theo th t thng. tng ca phng php tnh gi tr hm theo
kiu khn ngoan l ch tnh gi tr cc tham i ca mt hm khi cc gi tr ca chng l cn
thit, nhng biu thc no khng cn thit th b qua.
S dng tnh gi tr hm theo kiu khn ngoan, php tnh hm fac 1 s c rt gn
nh c trnh by di y. Vic tnh gi tr kt thc v cho kt qu ng. y ta s dng
biu thc if dng gi ng (pseuclo-notation). Tham i th ba ca cond s khng c
tnh nu n bng 0, v rng trong trng hp ny, khng cn tnh tham i na.
fac 1
--> cond (1=0) 1 (1*fac (1-1))
|| gi fac
--> if (1=0) then 1 else (1*fac (1-1))
--> if false then 1 else (1*fac (1-1))
--> 1*fac (1-1)
|| gi cond
|| tnh 1 = 0
|| phn t th nht
24
LP TRNH HM
--> 2
|| phn t th hai
hd (tl (map triple [1.. ]))
--> 6
|| phn t th hai ca danh sch c nhn 3
Thc t, ngn ng Miranda ch cho php xy dng cc danh sch hu hn. Ch khi ton
b cc phn t ca danh sch c yu cu, nh l :
sumlist [1..]
|| cng dn tt c cc s nguyn dng
hoc :
#[1.. ]
|| tnh di ca danh sch v hn
s lm cho h thng ri vo mt vng lp v hn (hoc gy trn b nh). Sau y l mt s v
d khc :
ones = 1 : ones
repeat a = L
where L = a : L
nats = [0.. ]
odds = [1, 3.. ]
squares = [ n*n | n <- [0.. ] ]
perfects = [ n | n <- [1.. ] : sum(factors n) = n ]
|| Tm cc s nguyn t n 2
primes = sieve [ 2.. ]
where sieve (p:x)=p : sieve [n|n<-x: n mod p>0 ]
Mc d phng php tnh gi tr hm theo kiu khn ngoan t ra c nhiu u th nhng
thc t, vic ci t rt tn km. Mt vn xy ra l chin lc rt gn theo th t thng
c th tnh mt biu thc mt nhiu ln, trong khi php rt gn theo th t p dng ch tnh
gi tr cc biu thc ng mt ln. Chng hn, t nh ngha hm double sau y :
double x = x + x
Php rt gn theo th t thng tnh biu thc :
double 23 * 45
nh sau :
double 23 * 45
--> 23 * 45 + 23 * 45
--> 1035 + 23 * 45
--> 1035 + 1035
--> 2070
Trong khi , php rt gn theo th t p dng li tnh n gin hn v hiu qu hn :
double 23 * 45
--> double 1035
--> 1035 + 1035
--> 2070
Vn ny c th c gii quyt bng cch s dng k thut th rt gn (graph
reduction). y l k thut hoc khng tnh, hoc tnh gi tr cc biu thc ng mt ln,
nhng khng tnh nhiu ln.
Mt vn khc l tnh gi tr ca cc tham i trc khi gi hm. Thc t cho thy vic
tnh trc tham i d dng ci t hn l tr hon thc hin chng. Tuy nhin, iu ny lm
NGUYN L LP TRNH HM
25
tng chi ph tnh gi tr hm theo kiu khn ngoan cao hn bnh thng. Hin nay, ngi ta
ang pht trin cc phng php ti u nhm gim tng chi ph ny.
Khng phi mi ngn ng hm u c kiu tnh khn ngoan nh va trnh by. Nhng
ngn ng khng c kh nng ny cho cc hm do ngi s dng t xy dng (user defined
functions) thng c sn mt vi hm vi ng ngha khn ngoan (v d hm cond). Cc
ngn ng mnh lnh cng c nhng yu t mang ng ngha khn ngoan c xy dng sn,
chng hn lnh if. Ngn ng C v Ada c cc php logic (dng short cut) and v or c
bit cho php tnh gi tr tham i th hai ch khi cn thit.
I.2.9. Mt s v d
Sau y ta xt mt s v d khc vit trong Miranda minh ha nhng c trng c bn
ca lp trnh hm va c trnh by trn y : loi b nhng phn t trng nhau trong mt
danh sch c sp xp th t, sp xp nhanh mt danh sch (quicksort), gii bi ton 8
qun hu v tm dy s Hamming.
2. Sp xp nhanh quicksort
Thut ton quicksort sp xp nhanh cc phn t ca mt danh sch (thng l cc s)
theo th t khng gim. sp xp, u tin quicksort xc nh gi tr ca phn t u tin
ca danh sch, gi l x. Tip theo, quicksort to ra hai danh sch con, mt danh sch cha
cc gi tr nh hn hoc bng x, v mt danh sch cha gi tr ln hn x. Mi mt danh sch
c sp xp mt cch quy (bng cch gi li quicksort). Cui cng, cc danh sch kt
26
LP TRNH HM
3. Bi ton tm qun hu
Ni dung bi ton tm qun hu (eight queens problem) nh sau : hy tm cch t tm
qun hu ln mt bn c vua (c 88 , lc u khng cha qun c no) sao cho khng c
qun hu no n c qun hu no ? Theo lut c vua, mt qun hu c th n c bt c
qun c (ca i phng) no nm trn cng ct, hay cng hng, hay cng ng cho thun,
hay cng ng cho nghch vi n.
NGUYN L LP TRNH HM
27
4. Bi ton Hamming
Bi ton Hamming (Hamming problem) sau y minh ha u th ca phng php tnh
gi tr hm theo kiu khn ngoan. Yu cu t ra l to cc s Hamming (Hamming number)
theo th t tng dn (increasing order), mi s c th c vit di dng :
2i 3j 5k
Nh vy, cc s Hamming ch cha cc tha s 2, 3 v 5. Do , kt qu chng trnh
s bt u vi cc s :
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, ...
v chng trnh dng khi ngi s dng khng mun tip tc na.
Thot nhn, ta c th ngh rng bi ton c gii bng cch s dng ba vng lp cho i, j
v k. Tuy nhin, xem xt k th bi ton tr nn hc ba, v rng dy kt qu phi c sp
xp v khng cho php cc s trng nhau.
s Hamming
Qu trnh
2
Qu trnh
3
Qu trnh
5
Trn cc
qu trnh
Hnh I.7. Gii bi ton Hamming nh cc qu trnh gii song song.
C th gii thch bi ton Hamming mt cch tinh t hn bng cch s dng mt m hnh
x l song song nh trong Hnh I.7. M hnh s dng ba qu trnh nhn, mi qu trnh nhn
mt dng gi tr vo ging nhau v to ra mt dng ra phn bit.
Qu trnh th nht nhn cc s a vo vi 2 gi ra dng kt qu. Tng t, qu trnh
th hai nhn cc s vi 3 v qu trnh th ba nhn cc s vi 5 gi ra dng kt qu. Mi
28
LP TRNH HM
NGUYN L LP TRNH HM
I.3
29
Kt lun
30
LP TRNH HM
Tm tt chng 1
NGUYN L LP TRNH HM
31
Bi tp chng 1
1. Vit cc hm Miranda tnh gn ng gi tr cc hm sau vi chnh xc e = 10-5
1 1 1
= 1 + +...
4
3 5 7
cho n khi
1
<
2n -1
x2
2 x4
2 4 x6
+
+
+ ...
cho n khi phn t th n < e
2
3 4
3 5 6
x2
x3
xn
xn
S = 1 - x +
+ ... + (-1) n
+ ... cho n khi
<
2!
3!
n!
n!
1+
S = 1+
y=
x2 x4 x6
x 2n
+ + +...+
+...
2! 4! 6!
(2n)!
x +
x + ... +
cho n khi
x 2n
< 105
(2n)!
c n > 1 du cn
32
LP TRNH HM
10. Vit m t chng trnh Miranda gii bi ton thp H N i (Tower of Hanoi) : chuyn N
a c kch thc khc nhau t m t cc qua cc th hai l y c c th ba lm cc trung gian,
sao cho lun lun tha mn m i ln ch chuyn m t a t mt c c ny sang mt cc
khc, trn mt cc th a sau nh hn ch ng ln trn a trc l n hn v a ln nht
di cng.
11. Vit m t chng trnh Miranda to ra cc s nguyn t s dng sng Eratosthnes.
Chng trnh c th khng kt thc. Th s d ng k thut tnh gi tr hm theo kiu khn
ngoan c li gii n gin v hiu qu.
12. Cy nh phn (binary tree) c biu din nh l m t mt danh sch gm ba phn t d
liu : nt gc (root node), cy con bn tri (left subtree) v cy con bn phi (right
subtree) ca nt g c. M i cy con li c xem l nhng cy nh phn. Cy, hoc cy con
rng (empty tree) c biu din bi mt danh sch rng. V d cho cy nh phn c 4 nt
[1, [2, [], []], [3, [4, [], []], []]] nh sau :
1
3
2
4
A line may take us hours, yet if it does not seem a moment's thought
All our stitching and unstitching has been as nought.
Yeats - Adam's Curse
hoc du hi (?) .
Mt dy cc php tnh gi tr biu thc trong m t vng tng tc c g i l m t chu
lm vic (session). Sau mi chu, Scheme a ra thi gian v s lng b nh (bytes) s
dng tnh ton.
tin theo di, cun sch s dng cc quy c nh sau :
3
4
33
34
LP TRNH HM
tin trnh by ting Vit, mt s phn ch thch v kt qu tnh ton khng in theo
kiu ch Courier.
Ch thch trong Scheme
Ch thch (comment) dng din gii phn chng trnh lin quan gip ngi c d
hiu, d theo di nh ng khng c hiu lc i vi Scheme (Scheme b qua phn ch thch
khi thc hin). Ch thch c bt u bi mt du chm phy (;), c vit trn m t dng
bt k, hoc t u dng, hoc cu i dng. V d :
; this is a comment line
(define x 2) ; nh ngha bin x c gi tr 2
;;; The FACT procedure computes the factorial
;;; of a non-negative integer.
(define fact
(lambda (n)
(if (= n 0)
1 ; Base case: return 1
(* n (fact (- n 1))))))
II.2.1.1. Kiu s
Kiu s ca Scheme c th l s nguyn (integer), s thc (real), s hu t (rational) v
s phc (complex ) nh sau :
Kiu s
s nguyn
s thc
s hu t
s phc
V d
52
3.0, -2.5
6/10, 23/5
3+4i, 3
Scheme khng phn bit s nguyn hay s thc. Cc s khng hn ch v ln, min l
b nh hin ti cho php.
NGN NG SCHEME
35
(sqrt x)
--> x
Cc php so snh sau y tr v #t nu kt qu so snh ln lt cc gi tr x1, ..., xn c
tho mn, ngc li tr v #f :
(= x1 ... xn)
(< x1 ... xn)
(<= x1 ... xn)
(> x1 ... xn)
(>= x1 ... xn)
V d :
(* 1 2 3 4 5 6 7 8 9)
--> 362880
(= 1 2 3 4 5)
--> #f
(= 1 1 1 1 1)
--> #t
(< 1 2 3 4 5)
--> #t
(> 4 3 2 1)
--> #t
(<= 1 2 3 4 5)
--> #t
(>= 6 5 4 3 2 1)
--> #t
36
LP TRNH HM
(+ 2.3 5)
--> 7.3
II.2.1.2.
*
+
<=?
V19a
pi-chia-2
a34kTMNs
is-this-a-very-long-name?
list->vector
Kiu lgch v v t
NGN NG SCHEME
37
38
LP TRNH HM
II.2.1.3. K hiu
Ngn ng Scheme khng ch x l cc gi tr kiu s, kiu lgch v kiu chui nh
trnh by, m cn c th x l k hiu nh php trch dn. Gi tr k hiu ca Scheme l mt
tn (gi ng tn bin) m khng gn vi mt gi tr no khc. Ch Scheme lun lun in ra cc
k hiu trch dn dng ch th ng.
Kiu trch dn vn hay gp trong ngn ng ni v vit hng ngy. Khi ni vi ai rng
hy vit ra tn anh, th ngi c th hnh ng theo hai cch :
- hoc vit Trng Chi, nu ngi tn l Trng Chi v hiu cu ni l vit ra tn
ca mnh.
- hoc vit tn anh, nu ngi hiu cu ni l phi vit ra cm t tn anh.
Trong ngn ng vit, ngi ta dng cc du nhy (n hoc kp) ch r cho cch tr
li th hai l : hy vit ra tn anh. Khi cn gn mt gi tr k hiu cho mt tn, ngi ta
hay gp sai st. Chng hn, vic gn gi tr k hiu l pierre cho m t bin c tn l
first-name :
(define first-name pierre)
*** ERROR unbound variable: pierre.
y xut hin sai st v Scheme tnh gi tr ca tn pierre, nhng tn ny li khng
c gi tr. ch cho Scheme gi tr chnh l k hiu pierre, ngi ta t trc gi tr
pierre m t php trch dn (quote operator) :
pierre
--> pierre
Khi nim trch dn c tc d ng quan trng : khi nim bng nhau trong ngn ng t
nhin v trong Scheme l khc nhau v mt Ton hc :
1+2=3
nh ng
1 + 2 3
(= (+ 1 2) 3)
--> #t
nhng :
(= (+ 1 2) 3)
--> error !!!!! khng cng gi tr
By gi, nu cn in ra gi tr c a first-name, ta c :
first-name
--> pierre
(define x 3)
NGN NG SCHEME
39
x
--> 3
x
--> x
H cc ngn ng Lisp rt thun tin cho vic x l k hiu. M t trong nhng p dng
quan tr ng c a Lisp l tnh ton hnh thc (formal computation). Ngi ta c th tnh o
hm ca mt hm, tnh tch phn, tm nghim cc phng trnh vi phn. Nh ng chng trnh
ny c th gii cc bi ton tt hn con ngi, nhanh hn v t xy ra sai st. Trong chng
sau, ta s thy c lm cch no Scheme tnh o hm hnh thc c a x3 l 3x2.
Mt x l k hiu quan tr ng na l x l chng trnh : m t trnh bin dch c cc d
liu l cc ch ng trnh c vit trn mt h thng k hiu l ngn ng lp trnh. Bn thn
mt chng trnh Scheme cng c biu din nh m t danh sch (s xt sau). Chng hn :
(define (add x y)
(+ x y))
40
LP TRNH HM
s c vit thnh :
(+ 4 76 19)
Ch t du cch hay khong tr ng (space) gia du php ton v gia m i ton hng.
Ngi ta c th trn ln cc php ton :
34*21 - 5*18*7 c vit thnh (- (* 34 21) (* 5 18 7)),
-(2*3*4)
c vit thnh (- (* 2 3 4)).
; = (+ 6 4)
R rng cc biu thc l ng nhau lm ngi c kh theo di, chng hn biu thc sau
y kh theo di :
(+ 1 (* 2 3 (- 5 1)) 3) ; = (+ 1 (* 2 3 4) 3) = (+ 1 24 3)
Nn vit biu thc trn nhiu dng khc nhau theo quy c vit tht dng (indentation)
v cn thng ng t ng t cc dng lnh trong cc chng trnh c cu trc (Pascal, C,
Ada...). Biu thc trn c vit li nh sau :
(+ 1
(* 2 3 (- 5 1))
3)
--> 28
NGN NG SCHEME
41
sin(a) + sin(b)
1 + a 2 + b2
c th vit trong Scheme :
(/ (+ (sin a) (sin b))
(sqrt (+ 1 (* a a) (* b b))))
42
LP TRNH HM
(define pi 3.14159)
khi , ta c
pi
--> 3.14159
II.3.2. nh ngha hm
II.3.2.1. Khi nim hm trong Scheme
Khi cn t tn cho biu thc cha cc tham bin, ta i n khi nim hm. V d ta cn
nh ngha mt hm tnh th tch c a hnh cu bn knh R. Ta s dng dng define c c
php nh sau :
(define (sphereVolume R)
(* 4/3 pi R R R))
NGN NG SCHEME
43
44
LP TRNH HM
II.3.2.3. S dng cc hm b tr
Do tnh th tnh hnh cu cn tnh lp phng c a m t s, do ta c th nh ngha hm
tnh lp phng :
(define (cube nb) (* nb nb nb))
Thng thng khi lp trnh, ngi ta thng c thi quen nh ngha li cc hm do c sai
st v thit k, thi c a b din dch Scheme l trnh nh ngha li tt c cc hm.
Cc nh ngha hm c th lng nhau. Cc nh ngha bn trong ca mt hm khng th
tip cn c t bn ngoi hm : l nhng nh ngha c tnh cc b (local definitions).
iu ny hon ton c li khi cn nh ngha cc i tng hay cc hm ph thu c nhau.
V d ta cn tnh x4 x2 vi m t hm c nh ngha nh sau :
(define (x4-minus-x2 x)
(define x2 (square x))
(* x2 (- x2 1)))
(x4-minus-x2 2)
--> 12
x2
--> ***ERROR --- unbound variable x2
nh ngha bn trong c a mt hm khc vi lnh gn trong cc ngn ng mnh lnh
(chng hn Pascal) :
(define x 1)
(define (f)
(define x 2) ; nh ngha x trong mi trng c c b i vi f
(+ x 3))
x
--> 1
NGN NG SCHEME
45
(f)
--> 5
x
--> 1
; li g i f khng lm thay i nh ngha ton cc c a x
II.3.3.
Cu trc iu khin
46
LP TRNH HM
Cc biu thc e1, e2, ... c tnh lin tip cho n khi gp mt gi tr ng, gi s ej,
khi gi tr tr v c a cond l gi tr c a s-biu thc sj.
m bo t nht c m t php th thnh cng, ngi ta thng t vo cui t kha
else. Khi , sN+1 c tnh nu mi e1, ... , eN u sai.
NGN NG SCHEME
47
nhn c bng cch tnh ln lt dy cc biu thc s1, s2, ... v dng li ngay khi gp mt
gi tr #f v tr v kt qu #f, nu khng, tr v gi tr cui l sN.
V d , nu cc s thc a, b, c l ba cnh ca mt tam gic, th biu thc :
(and (< a (+ b c)) (< b (+ c a)) (c (+ a b))
tr v gi tr #t. Biu thc sau trnh c li chia cho 0 :
(and (< 2 8) (number? yes) (+ 1 (/ 2 0)))
--> #f
Mt cch tng t, gi tr tng t ca :
(or s1 s2 ... sN)
Nhn c bng tnh ln lt biu thc s1, s2, ... v dng li khi gp mt gi tr ng
#t tr v gi tr #t ny, nu khng, tr v gi tr #f.
(or (= 2 3) 10 (number? yes))
--> 10
; v 10 l gi tr u tin khc #f
II.3.3.2.
Bin cc b
C ngha rng trong sut qu trnh tnh ton, thn hm body, tn bin vj ch nh gi tr
biu thc sj.
V d : Din tch tam gic cnh a, b, c c tnh t na chu vi p nh sau :
(let ((p (/ (+ a b c) 2)))
(sqrt (* p (- p a) (- p b) (- p c))))
Do cn phi nh ngha nhiu lin kt link song song, nn ng i ta t tp hp cc lin
kt (v1 s1)...(vk sk) gia hai du ngoc phn bit vi phn thn hm body. Ngi
ta thng vit dng let theo ct dc v phn thn hm li lch qua tri cho d c :
48
LP TRNH HM
V d :
(let ((a 20) (b (* 4 8)) (c 10)
(* c (- a b)))
--> 120
Ch rng cc biu thc sk c tnh trc v ch khi , cc bin vk mi c nh
ngha.
(define (f x y) (let ((x y) (y x)) (- x y)))
(f 2 5)
--> 3
; khng phi l 0, cng khng phi l 3
(define (pitagore a b)
(let ((a2 (* a a)) (b2 (* b b)))
(sqrt (+ a2 b2))))
(pitagore 3 4)
--> 5.
NGN NG SCHEME
(let* ((a
(b
(c
(+ a
--> 64
(* a a))
(* 3 a))
(* a b)))
b c ))
49
; a = 4
; b = 12
; c = 48
Tht v y, trong thn ca let*, bin a=4 do trc , a=2, bin b=12 do a=4, bin
c=48 do a=4 v b=12.
Dng let* thc ra khng tht cn thit v c th c biu din bi cc let l ng nhau.
V d trn y c vit li theo dng let nh sau :
(let ((a (* a a)))
(let ((b (* 3 a)))
(let ((c (* a b)))
(+ a b c))))
--> 64
Dng let lng nhau c dng lm r s ph thuc gia cc biu thc. M t cch
t ng qut, quan h gia let v let* nh sau :
(let ((v1 s1))
II.3.3.3. nh ngha cc v t
Nh ni, tn cc v t trong Scheme u t mt du chm (?) h i sau cng. NSD c
th nh ngha cc v t v c ng phi tun theo quy c ny. Chng hn ta nh ngha li v t
kim tra mt s nguyn l chn (even) hay l (odd) m khng s d ng cc v t even? v
odd? c sn trong th vin ca Scheme :
(define (is-even? n)
(if (= n 0)
#t
(is-odd? (- n 1))))
(define (is-odd? n)
(if (= n 0)
#f
(is-even? (- n 1))))
(is-even? 4)
--> #t
(is-odd? 5)
--> #t
50
LP TRNH HM
(define (multiple2357? n)
(or (zero? (remainder n
(zero? (remainder n
(zero? (remainder n
(zero? (remainder n
2))
3))
5))
7))))
Sau y ta vit v t kim tra mt nm dng lch cho c phi l nm nhun hay
khng ? Mt nm l nhun nu chia ht cho 400 hoc nu khng phi th nm phi
chia ht cho 4 v khng chia ht cho 100. Trc tin ta vit v t kim tra mt s ny c
chia ht mt s khc hay khng.
(define (divisibleBy? number divisor)
(= (remainder number divisor) 0))
(define (isBissextile? year)
(or (divisibleBy? year 400)
(and (divisibleBy? year 4)
(not (divisibleBy? year 100)))))
(isBissextile? 1900)
--> #f
(isBissextile? 2004)
--> #t
II.3.4. S quy v s lp
II.3.4.1. S quy
C nhiu s quy (recursive schema) c ng dng quen thuc trong lp trnh,
ngn ng Scheme s dng s quy nguyn thu (primitive) c c php nh sau :
(define (<name> <arg>)
(if (zero? <arg>)
<init-val>
(<func> <arg> (<name> (- <arg> 1)))))
y, c <init-val> v <func> u cha c nh ngha theo hm <name>.
NGN NG SCHEME
51
Phng php lp trnh quy mang tnh t ng qut v tnh hiu qu khi gii quyt nhng
bi ton tnh hm c ln d liu pht trin nhanh. p dng k thut quy, lun lun
phi tm cu tr li cho hai cu hi sau y :
1. C tn t i hay khng cc trng hp c bit ca bi ton cho nhn c m t
li gii trc tip dn n kt qu.
2. C th nhn c li gi i ca bi ton cho t li gi i ca cng bi ton ny
nhng i vi cc i tng nh hn theo mt ngha no ?
Nu c cu tr li th c th dng c quy. Sau y l mt s v d.
II.3.4.2. V d
1. Tnh tng bnh phng cc s t 1 n n
52
LP TRNH HM
( n - n )
(1 + 5 )
(1 - 5 )
vi =
~ 1.6,
v =
~ 0.6
2
2
5
y, f c gi l s vng (golden number), vi l nghim ca phng trnh :
f(n) =
x2 = 1 + x.
Hm fib trong Scheme c nh ngha nh sau :
(define (fib n)
(if (<= n 1)
n
(+ (fib (- n 1)) (fib (- n 2)))))
(n 0) = (n n) = 1
( n + 1 k) = ( n k) + ( n k- 1 )
Chng hn (5 2) = 10. Ta xy dng hm coef-binomial nh sau :
(define (coef-binomial n k)
(cond ((zero? k) 1)
((= k n) 1)
(else (+ (coef-binomial (- n 1) k)
(coef-binomial (- n 1) (- k 1))))))
(coef-binomial 5 2)
--> 10
(coef-binomial 0 0)
--> 1
NGN NG SCHEME
53
Vi li gi n=3, (n<5), ta c :
(bad-fact 3)
; = (quotient
; = (quotient
; = (quotient
; = (quotient
--> 6
(bad-fact 4) 4)
(quotient (bad-fact 5) 5) 4)
(quotient 120 5) 4)
24 4)
54
LP TRNH HM
(fact 0) = 1 = 0!
II.3.4.5. S lp
Ta ly li php tnh giai tha : tnh fac 3, trc tin b din dch Scheme phi tnh
(fact 2), mun vy cn ghi nh ln sau thc hin php nhn. Tng t, cn phi tnh
(fact 1), trc khi tnh (* 2 (fact 1)). Nh v y c m t chu i cc php tnh
khc nhau, tng tuyn tnh vi n. Ngi ta g i y l qu trnh quy tuyn tnh (linear
recursive processus).
Trong trng hp tnh hm fib, lc u Scheme hon thc hin m t php cng tin
hnh hai li gi quy m khng th tnh ton ng thi. Ngi ta g i y l qu trnh
quy dng cy (tree recursive processus). R rng vi kiu qu trnh ny, hm fib i h i
mt chi ph tnh ton ng k. By gi ta xt m t cch tnh giai tha khc :
(define (fact n)
(define (i-fact p r)
(if (= p 0)
r
(i-fact ( p 1) (* p r))))
(i-fact n 1))
NGN NG SCHEME
55
p dng :
(fact
; =
; =
; =
; =
--> 6
3)
(i-fact
(i-fact
(i-fact
(i-fact
3
2
1
0
1)
3)
6)
6)
56
LP TRNH HM
(define (fib n)
(define (i-fib x y p) ; x=fib(n-p+1), y=fib(n-p)
(if (= p 0)
y
(i-fib (+ x y) x (- p 1))))
(i-fib 1 0 n))
(fib 100)
--> 354224848179261915075
(fib 200)
--> 280571172992510140037611932413038677189525
NGN NG SCHEME
57
58
LP TRNH HM
Tm tt chng 2
NGN NG SCHEME
59
Bi tp chng 2
1. Gii thch cc biu thc s hc sau y, sau tnh gi tr v so snh kt qu :
(+ 23 (- 55 44 33) (* 2 (/ 8 4)))
(define a 3)
a
(/ 6 a)
(define b (+ a 1))
(+ a b (* a b))
2. Gii thch cc biu thc lgic sau y, sau o tnh gi tr v so snh kt qu (c th s
dng hai bin a v b trong bi tp 1) :
(= 2 3)
(= a b)
(not (or (= 3 4) (= 5 6)))
(+ 2 (if (> a b) a b))
3. Gii thch cc biu thc iu kin sau y, sau o tnh gi tr v so snh kt qu :
(if (= 1 1) waaw brrr)
(if (= 4 4) 5 6)
(if (> a b) a b)
(if (and (> b a) (< b (* a b))) b a)
(+ 2 (if (> a b) a b))
((if (< a b) + -) a b)
(cond ((= 1 1) waaw 1)
((= 2 2) waaw 2)
((= 3 3) waaw once more)
(else waaw final))
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
60
LP TRNH HM
x2 + y2 +
x2 - y2
x2 - y2
khi bit gi tr c a x, y
CHNG I.
I.1.1.
I.1.2.
I.1.3.
I.1.4.
I.1.5.
1.
2.
3.
4.
I.3
KT LUN ......................................................................................................................................29
CHNG II.
NGN NG SCHEME...................................................................................................33
II.1
II.2
II.2.1.1.
II.2.1.2.
II.2.1.3.
II.2.2.
II.2.3.
II.3
Kiu s .....................................................................................................................................34
Kiu lgch v v t...............................................................................................................36
K hiu.....................................................................................................................................38
II.3.1.
II.3.2.
II.3.2.1.
II.3.2.2.
II.3.2.3.
II.3.2.4.
II.3.3.
II.3.3.1.
Dng iu kin if.................................................................................................................45
II.3.3.2.
Bin cc b .............................................................................................................................47
1.
nh ngha bin cc b nh dng let................................................................................................47
2.
Phm vi t ng ca dng let ...........................................................................................................48
3.
Lin kt bin theo dy : dng let* ....................................................................................................48
II.3.3.3.
nh ngha cc v t .............................................................................................................49
II.3.4.
S quy v s lp .............................................................................................50
II.3.4.1.
S quy...........................................................................................................................50
II.3.4.2.
V d .........................................................................................................................................51
1.
Tnh tng bnh phng cc s t 1 n n........................................................................................51
2.
Tnh giai tha .....................................................................................................................................51
3.
Hm Fibonacci....................................................................................................................................51
4.
Tnh cc h s nh thc .....................................................................................................................52
II.3.4.3.
Tnh dng ca li gi quy..............................................................................................52
II.3.4.4.
Chng minh tnh dng ........................................................................................................54
II.3.4.5.
S lp..................................................................................................................................54
II.3.5.
61
1.
2.
3.
iu d liu phc hp trong Scheme gm kiu chui (string), kiu vect (vector), kiu b
K i
(doublet), kiu danh sch. Ngoi ra, Scheme cn mt s kiu d liu phc hp khc.
Kiu d liu th tc (procedure) ch nh cc bin cha gi tr tr v ca hm. Kiu d liu
cng (port) ch nh cc cng vo-ra tng ng vi cc tp v cc thit b vo-ra (bn phm,
mn hnh). Cui cng, tt c cc kiu d liu va xt trn y, k c kiu n gin, u c
Scheme gom li thnh mt giuc c gi l kiu s-biu thc.
Sau y, ta s ln lt trnh by cc kiu d liu chui, vect, b i v danh sch. Trong
phn trnh by kiu d liu b i, chng ta s nghin cu khi nim tru tng ho d liu
(data abstraction).
III.1
Kiu chui
62
LP TRNH HM
(string-ref greeting 0)
--> #\S
(string-ref greeting 20)
--> #\!
(define Str
; s dng hm ghp lin tip cc chui
(string-append Chuoi \
greeting
\ co do dai 21.))
(display Str)
--> Chuoi Scheme ; cha`o ba.n ! co do dai 21.
V t string? dng kim tra kiu chui :
(string? greeting)
--> #t
S dng hm make-string, ta c th to ra mt chui c di bt k v cha cc k
t bt k :
(define a-5-long-string (make-string 5))
a-5-long-string
--> ?????
(define a-5-asterisk-string (make-string 5 #\*))
a-5-asterisk-string
--> *****
Hm string-set! dng thay th mt k t trong chui
cho ti mt v tr bt k cho bi ch s :
(string-set! a-5-long-string 0 #\c)
a-5-long-string
--> c????
Trn y ta s dng cc hm x l chui :
(string? Str)
Tr v #t nu str l mt chui, nu khng tr v #f.
(string-append str1 str2 ...)
Tr v chui ghp lin tip cc chui str1, str2.
(make-string k [char])
Tr v mt chui mi c di k. Nu c tham bin char, th tt c cc k t ca chui
s l char, nu khng ni dung ca chui s khng c xc nh.
(string-length str)
Tr v di ca chui str.
(string-ref str k)
Tr v k t th k ca chui str. Gi tr ca k phi hp l.
(string-set! string k char)
t gi tr k t th k ca chui str bi char. Gi tr ca k phi hp l.
Sau y l mt s hm x l chui khc ca Scheme :
Cc v t so snh chui :
(string=? str1 str2)
63
64
LP TRNH HM
III.2
III.3
65
Kiu d liu b i
66
LP TRNH HM
III.3.2. nh ngha b i
Trong ngn ng Scheme, mt b i, hay cn c gi l cp c du chm (dotted pair),
l kiu d liu phc hp tng t bn ghi gm mt cp gi tr no c th t. C mt du
chm phn cch hai gi tr lu gi trong b i v cc du cch phn cch gia du
chm v cc gi tr. Phn t (trng) th nht c gi l car, phn t th hai cdr.
1
Cc tn car v cdr xut hin khi John Mc. Carthy xut ngn ng Lisp chy trn
IBM-704 nm 1956 v c gi li theo truyn thng.
Gi s any l mt kiu d liu no ca Scheme, k php ca cu trc b i
doublet c c t nh sau :
types doublet
functions
cons : any any
-> doublet
car : doublet -> any
cdr : doublet -> any
pair? : any
-> boolean
axioms var a, y : any
car(cons(x, y)) = x
cdr(cons(x, y)) = y
T kiu tru tng b i, to ra b i, ngi ta s dng cons :
(cons s1 s2)
--> (<gi tr ca s1> . <gi tr ca s2>)
Sau y l mt v d v mt b i : :
(cons year 2004)
; gm mt k hiu v mt s
-> (year . 2004)
(cons 29 #t)
; gm mt s v mt tr lgch
-> (29 . #t)
nh ngha bin c gi tr l mt b i :
1
car = content of the address register, cdr = content of the decrement register.
67
cdr
1
68
LP TRNH HM
x
1
2
(a)
4
1
3
(b)
69
III.3.4. ng dng b i
1.
Biu din cc s hu t
Scheme s dng b i biu din kiu d liu danh sch. Trc khi trnh by cc php
x l trn danh sch, ta c th s dng b i minh ho mt cch biu din cc s hu t,
l mt cp s nguyn (trong Scheme, s hu t c dng tin nh n/d).
Gi s ta cn xy dng mt tp hp cc hm cho php x l cc s hu t nh : cng (+),
tr (), ... Gi s kiu s hu t rational c c t nh sau :
types rational
functions
create-rat : integer integer > rational
numer :
rational
> integer
denom :
rational
> integer
=rat :
rational rational
> boolean
var r : rational ; n, n1, n2, d, d1, d2 : integer
preconditions
(r=create-rat(n, d)) (numer(r)*d=denom(r) *n)
(denom(r) 0)
axioms
numer(create-rat(n, d)) = n
denom(create-rat(n, d)) = d
(=rat(create-rat(n1, d1), create-rat(n2, d2)) (n1*d2 =
n2*d1)
Hm create-rat c vai tr to s hu t t t s n v mu s d. Cc hm numer tr
v t s (numerator) v denom tr v mu s (denominator) ca s hu t l cc hm tip
nhn. Hm =rat l hm kim tra hay chuyn kiu, kim tra nu hai s hu t l bng nhau.
Khi r l mt s hu t, r=n/d, th t s ca r l n v mu s l d0. Hai s hu t
r1=n1/d1 v r2=n2/d2 bng nhau khi v ch khi n1.d2 =n2/d1.
Ch rng phn functions mi ch nh ngha c php ca hm, cha xy dng ng
ngha cho n. Cc tn php ton c mt trong k php l cha , m cn c thm phn
axioms. V d cc nh ngha trong Scheme sau y tuy ng n v mt c php, nhng
hon ton khng c ngha s dng i vi kiu tru tng rational :
(define (create-rat n d) n)
(define (numer r) r)
(define (denom r) r)
(define (=rat r1 r2) (= r1 r2))
(create-rat n d) to s hu t t t s n v mu s d
(numer x)
tr v t s (numerator) ca s hu t x
(denom x)
tr v mu s (denominator) ca s hu t x
(=rat r1 r2)
kim tra nu r1 v r2 u cng l mt s hu t
S dng b i, ta nh ngha li bn hm trn y theo cch hot ng c m t trong
thnh phn axioms nh sau :
(define (create-rat n d) (cons n d))
70
LP TRNH HM
71
(+rat R1 R2)
--> (22 . 15)
(rat->real R1)
--> 0.666666666666667
(rat->real R2)
--> 0.8
V d bi ton x l s hu t dn n nhiu mc lp trnh c tru tng gim dn nh sau :
X l cc s hu t
X l cc php ton trn cc s hu t : +rat, -rat, *rat, /rat, =rat
X l s khi trn cc s hu t : create-rat, numer, denom
X l s khi trn cc b i : cons, car, cdr
Khi thit k chng trnh nh hng cu trc trong phng php tinh ch tng bc,
ngi lp trnh quan tm n cc mc tru tng cao hn, bng cch u tin chc nng x l
nh th no, m chn chm li (tr hon) cch biu din cc cu trc d liu tng ng. i
vi cc s hu t, ta c th biu din chng di dng phn s rt gn nh sau :
(define (create-rat n d)
(define g (gcd (abs n) (abs d)))
; Ch hm th vin gcd (greatest common divisor)
; ch tnh c s chung ln nht cho cc s nguyn dng
(cons (quotient n g) ( quotient d g)))
(define (numer r) (car r))
(define (denom r) (cdr r))
(define (=rat x y)
(and (= (car x) (car y))
(= (cdr x) (cdr y))))
(create-rat 6 14)
--> (3 . 7)
(gcd 12 3)
--> 3
Cc nh ngha hm trn y khng lm thay i tnh cht s hc ca cc s hu t, cng
nh khng lm thay i mc tru tng ca bi ton. Hai cch nh ngha th tc
create-rat va trnh by l ng tin cy v trc khi gi chng, ta gi thit rng iu
kin u (d 0) c tho mn.
D phng v khc phc nhng sai st c th xy ra, trong khi lp trnh hay trong qu
trnh khai thc ca ngi s dng, bng cch kim tra iu kin u, c gi l phng
php lp trnh d phng (defensive programming). Phng php lp trnh ny lm cho
chng trnh tr nn ng tin cy v d thuyt phc ngi s dng.
Ta vit li th tc create-rat nh sau :
(define (create-rat n d)
(if (zero? d) ; kim tra iu kin u
(display ERROR: *** Mu s bng 0 !)
(cons n d)))
(create-rat 4 0)
--> ERROR: *** Mu s bng 0 !
72
2.
LP TRNH HM
73
L
b
H
V
y
0
74
LP TRNH HM
(value-L R)
--> 3
(value-H R)
--> 4
III.4
()
--> ()
(* 4 5)
--> (* 4 5)
75
76
LP TRNH HM
( b c ) ()
( ( c ) )
d )
( b c ) ()
( ( c ) )
cc phn t mc 1
b c
( c )
cc phn t mc 2
cc phn t mc 3
77
(cons 1 2)
--> (1 . 2)
(cons 1 ())
; ch du quote do danh sch rng lm tham i
--> (1)
; khng phi (1 . ())
(cons 1 (cons 2 (cons 3 ())))
-> (1 2 3)
; khng phi (1 . (2 . (3 . ())))
xy dng danh sch, Scheme thng s dng hm list. Quan h gia b xy cons
v cu trc list c tm tt bi ng thc sau :
(list <e1> ... <eN>) =
(cons <e1> (cons <e2> ... (cons <eN> ())...))
V d :
(list (cons 1 2) (cons 3 4))
--> ((1 . 2) (3 . 4)) ; (1 . 2) v (3 . 4) l cc b i
Hm list nhn mt s tham i ty l cc s-biu thc tr v mt danh sch mi t
hp t cc gi tr ca cc tham i . V d :
(list 1 2 3)
--> (1 2 3)
(list (a b) (c d) (c d) () ((e)))
--> ((ab) (cd) () (e))
Danh sch sau y gm 3 phn t, phn t th nht l du + :
(+ 1 2)
--> (+ 1 2)
Ch kiu d liu ca cc phn t danh sch :
(list a b c)
--> Error: undefined variable a
(list a b c)
(a b c)
Cc dng car v cdr dng tip cn n cc phn t ca mt danh sch khc rng.
Hm (car L) tr v phn t u tin ca L
(car (a b c))
--> a
(car (1 2 3)) == (car (quote 1 2 3))
--> 1
(car (+ 1 2))
--> +
(car 1)
--> quote
Hm (cdr L) tr v danh sch L ly i phn t u tin
(cdr (a b c))
--> (b c)
Ta cng c cc ng thc sau :
(car (cons s L)) = s(cdr (cons s L)) = L
78
LP TRNH HM
Vi quy c du gch trn tn ch nh gi tr ca mt biu thc. Trong Scheme, car hay cdr
ca mt danh sch rng u dn n mt li sai, trong khi trong cc ngn ng pht trin t Lisp th
thng c kt qu tr v l mt danh sch rng. Nu mun thay i tn cc hm car v cdr
ny, ch cn nh ngha cc hm ng ngha head v tail nh sau :
(define head car)
(define tail cdr)
Tuy nhin, khng nn nh ngha nh vy, v rng s gp kh khn khi cng vic lp trnh
c s tham gia ca nhiu ngi. Bng cch t hp cc hm car hoc cdr, ta c th tip cn
n bt k mt phn t no ca mt danh sch :
(car (cdr week-list))
--> mardi
(car (cdr (cdr week-list))))
--> mercredi
Cch vit t hp trn y s lm ngi c kh theo di. Chnh v vy ngi ta a ra
mt h thng vit tt ch nh s t hp ti a l bn car hay cdr. Scheme quy c :
cx1x2x3x4r
vi xj l mt a hoc mt d, j =1..4
79
80
LP TRNH HM
81
b c) 0)
b c) 2)
b c) 3)
b c . d) 2)
b c . d) 3)
())
(a b c))
a)
(3 . 4))
3)
3. Cc hm chuyn i kiu
(string->list str)
(list->string L)
(string->number str [radix])
82
LP TRNH HM
83
i khi ngi ta cn kim tra nu mt s-biu thc khng phi l mt danh sch v kim
tra nu mt danh sch c phi c rt gn thnh mt phn t duy nht khng. Ta thm cc
v t sau y vo th vin cc tin ch vn cha c trong th vin tin nh ca Scheme :
V t atom? kim tra nu mt s-biu thc khng phi l mt danh sch :
(define (atom? s)
(not (pair? s)))
V t singleton? kim tra mt danh sch c rt gn thnh mt phn t duy nht :
(define (singleton L)
(null? (cdr L)))
Ngi ta cng thng phi kim tra nu mt i tng l mt phn t mc th nht ca
mt danh sch. Mun vy, ngi ta s dng mt hm tin nh (member S L). Hm ny
tr li mt phn ca danh sch L cha phn u tin (first ocurrence) ca gi tr s, hoc tr v
#f nu danh sch L khng c. S so snh c thc hin nh kim tra equal? :
(member (b) (a b c d))
--> #f
(member (b) (a b c (b) d))
--> ((b) d)
Scheme xem cc gi tr bng nhau cc mc chnh xc khc nhau. V t equal? so
snh cc cu trc nhng khng phi l s so snh tn ca cc i tng. Tn ca cc i
tng c kim tra nh v t eq? v tn ti mt v t so snh t cht ch hn l eqv?.
Nh vy, so snh cc danh sch hoc cc chui, ta s dung equal?, so snh cc
s, s dng = v so snh cc k hiu, s dng eq?. Scheme c ba hm so snh hot ng
nh sau :
member s dng php kim tra equal?
memv
s dng php kim tra eqv?
memq
s dng php kim tra eq?
Sau y l nh ngha ca hm member :
(define (memq s L)
(cond
((null? L) #f)
((eq? (car L) s) L)
(else (memq s (cdr L)))))
V d :
84
LP TRNH HM
85
86
LP TRNH HM
87
(iota 10)
--> (0 1 2 3 4 5 6 7 8 9 10)
3. Nghch o mt danh sch
Do th vin Scheme c hm nghch o mt danh sch ca l reverse :
(reverse (iota 9))
--> (9 8 7 6 5 4 3 2 1 0)
nn ta c th nh ngha mt hm khc nghch o mt danh sch. Nguyn l hot ng
tng t hm iota : nghch o phn cn li ca danh sch v thm vo cui danh sch
phn t u tin. Hm myreverse c nh ngha nh sau :
(define (myreverse L)
(if (null? L)
()
(append1 (myreverse (cdr L)) (car L))))
(myreverse (a (b c d) e)
--> (e (b c d) a)
4. Hm append c hai tham i
Gi s ta khng s dng hm append tin nh m t xy dng mt hm khc nh hm
cons. Hm append2 ghp hai danh sch L1 v L2 tr v mt danh sch nh sau :
(define (append2 L1 L2)
(if (null? L1)
L2 ; Nu danh sch L1 l rng, th kt qu tr v l L2
; Nu L1 (), t car vo u php ghp phn cn li ca L1 vi L2.
(cons (car L1) (append2 (cdr L1) L2))))
(append2 (a b c) ((c d)))
--> (a b c (c d))
Li gi quy ch c tc dng i vi danh sch L1 (lm di gim dn) nhng m
bo tnh dng. Hm append2 khng gi n hm append. V nguyn tc, ngi lp trnh
c th thay i cc hm tin nh trong th vin, nhng gp nguy c khng qun l ht cc
sai st xy ra.
5. Loi b cc phn t khi danh sch
Cho s-biu thc s v danh sch L, cn xy dng hm remove sao cho loi b ht khi L
mi phn t c gi tr s mc mt. Xy ra ba trng hp nh sau :
Nu danh sch rng, th kt qu tr v cng rng.
Nu danh sch bt u bi mt phn t bng s, th ch cn loi b s khi phn cn li
ca danh sch.
Nu danh sch khng bt u bi mt phn t bng s, th bt u bi vic loi b s
khi phn cn li ca danh sch.
Sau y l hm remove :
(define (remove s L)
(cond ((null? L) ())
((equal? s (car L)) (remove s (cdr L)))
(else (cons (car L) (remove s (cdr L))))))
88
LP TRNH HM
(remove a (a b c a d))
--> (b c d)
6. Bi ton tnh tng con
Cho mt s nguyn N v mt danh sch Lnb gm cc s nguyn dng tng dn. Hy tm
mt tp hp cc phn t ca Lnb c tng bng N.
V d, cho N = 21, t danh sch (1 1 3 5 7 10 12 15), ta c th chn cc phn t
(1 1 7 12). Nu danh sch rng th ta quy c tng tr v bng 0. Cn nu danh sch
khc rng th gi s phn t u tin ca danh sch l x0 (l phn t b nht), ta s xt cc
trng hp sau y :
Nu x0 ln hn N th s khng c li gii v kt qu s l #f.
Nu x0 = N th kt qu tr v s l danh sch ch c mi phn t x0.
Nu x0 nh hn N th ta kim tra x0 c thuc vo li gii hay khng. Mun vy, ta gii li
bi ton ny cho cc phn t khc ca danh sch v vi tng by gi l N x0 :
(a) Nu nhn c mt li gii b phn, ch cn thm vo x0.
(b) Ngc li khng c li gii v tip tc i vi cc phn t khc x0.
Sau y l chng trnh :
(define (goodcount N Lnb)
(cond ((null? Lnb) (if (zero? N) () #f))
((< N (car Lnb)) #f)
((= N (car Lnb)) (list N))
(else (let ((partresult
(goodcount (- N (car Lnb)) (cdr Lnb))))
(if partresult
(cons (car Lnb) partresult)
(goodcount N (cdr Lnb)))))))
(goodcount 21 (1 1 3 5 7 10 12 15))
--> (1 1 7 12)
7. Lp danh sch cc s nguyn t
Cho mt s nguyn n, cn tm cc s nguyn t trong khong 2..n. C nhiu thut ton
tm s nguyn t, sau y l thut ton c s dng sng (sieve) Eratosthnes vit bng ngn
ng mnh lnh :
1. Khi ng tp hp kt qu S cha cc s nguyn t.
2. Xy dng sng sieve cha danh sch cc s 2..n.
3. Repeat
Tm s nguyn t prime.
Thm prime vo tp hp kt qu S.
Loi tr khi sieve cc bi s ca prime l 2*prime, 3*prime...
until sieve = rng
Sau y l chng trnh Scheme :
(define (interval-list m n)
(if (> m n)
()
(cons m (interval-list (+ 1 m) n))))
89
(define (sieve L)
(define (remove-multiples n L)
(if (null? L)
()
(if (= (modulo (car L) n) 0)
; division test
(remove-multiples n (cdr L))
(cons (car L)
(remove-multiples n (cdr L))))))
(if (null? L)
()
(cons (car L)
(sieve (remove-multiples (car L) (cdr L))))))
(define (primes<= n)
(sieve (interval-list 2 n)))
(primes<= 500)
--> (2 3 5 7 11
71 73 79 83
149 151 157
227 229 233
307 311 313
389 397 401
467 479 487
13 17 19 23 29 31 37 41 43 47 53 59 61 67
89 97 101 103 107 109 113 127 131 137 139
163 167 173 179 181 191 193 197 199 211 223
239 241 251 257 263 269 271 277 281 283 293
317 331 337 347 349 353 359 367 373 379 383
409 419 421 431 433 439 443 449 457 461 463
491 499)
90
LP TRNH HM
91
Kiu tru tng ca dng thc so snh bng nhau (equality) c nh ngha nh sau :
=
: number number
boolean
eq?
: symbol any
boolean
hoc :
eq?
: any symbol
boolean
char=?
: character character boolean
string=? : string string
boolean
Sau y l bng so snh bng nhau theo kiu d liu Scheme.
D liu
Kiu s number
Kiu k t character
Kiu chui string
Kiu bt k :
boolean, symbol,
number, character,
empty list, pair,
vector, string,
procedure
Kiu pair, vector,
string
Php so snh
=, <, <=, >, >=
char=?
string=?
eqv?, eq?
equal?
V d
(= 2 2) --> #t
(char=? #\A #\a)
--> #f
(string=? "123" "123")
--> #t
(eqv? #\A #\A)
--> #t
(eqv? 'toto 'toto)
--> #t
(eqv? "123" "123")
--> #t
(equal? "123" "123")
--> #t
92
LP TRNH HM
#\a #\a)
"123" "123")
'(1 . 2) '(1 . 2))
'(1 2 3 4 5) '(1 2 3 4 5) )
93
y ; xem ni dung ca y
--> ((a . b ) . c)
Biu din dng cy (v n gin) ca cc b i nh sau :
B i (a . b)
c
a
b
B i ((a . b) . c)
. (1 2))
(a 1 2)
. (b . (c . d)))
(a b c . d)
s1
s2
sN
( )
94
LP TRNH HM
(set-car! C 5)
D ; xem ni dung ca D
--> (3 5 . 2)
C
D
1
5
Hnh III.8. t bin ca C cng l t bin ca D.
Ngi ta cng c th tit kim c nhiu b nh bng cch biu din mi b i trong
mt n v nh. Sau y ta xt mt v d v kh nng xy ra hiu ng ph khi thc hin cc
php t bin trn cc danh sch.
(define X (list 1 2 3 4))
(define Y (cdr X))
; X v Y c cng danh sch con (2 3 4)
(set-car! X 5) ; thay i X m khng nh hng n Y
X
--> (5 2 3 4)
Y
--> (2 3 4)
X
Y
1
2
3
6
( )
4
95
Y
--> (6 3 4)
Tuy nhin, sau khi gn li phn cdr ca X cho mt danh sch mi, th con tr Y vn tr
v danh sch c, kng thay i :
(set-cdr! X (list 7 8)) ;X v Y c lp (khng chung nhau b i no)
X
--> (5 7 8)
Y
--> (6 3 4)
S dng hm t bin set-cdr!, ta c th to ra cc danh sch ni vng quanh vi
nhau nh sau :
(define X (list 1))
X
--> (1)
(set-cdr! X X)
(car X)
--> 1
X
--> 1 1 1 1 1 ... 1 1 1 ... ; v hn ln !
Cc hm append, reverse, map (s xt chng sau), ... thng ri vo trng thi
qun nu mt trong cc tham i l mt danh sch ni vng.
X
( )
1
Hnh III.10. t bin to danh sch ni vng c th gy ra qun v hn.
Sau y ta xt mt v d s dng t bin ghp danh sch. Gi s cho hai danh sch
L1 v L2, ta cn ghp chng nhn c mt danh sch mi. Gi |L1| l di (length)
ca danh sch L1, ta c hai gii php, mt gii php khng s dng t bin, nh sau :
Cch 1 : to ra |L1|| b i
; concat : List(T) List(T) List(T)
(define (concat L1 L2)
(if (null? L1)
L2
(cons (car L1) (concat (cdr L1) L2))))
(concat '(1 2) '(3 4 5))
--> (1 2 3 4 5)
Cch 2 : s dng t bin.
Gi s n gin, L1 khc rng v kt qu khng to ra b i mi. Nh t bin, b
i cui cng ca L1 tr ti L2.
96
LP TRNH HM
97
98
LP TRNH HM
99
(list x y x y)
--> (x y 9999 (a b c))
Nh vy, dng trch dn quote cho s-biu thc khi khng cn tnh gi tr cc thnh phn
ca n, cn khi cn tnh gi tr, cn t mt du phy trc nhng thnh phn ca s-biu thc
cn tnh. Ngha l :
s = `s nu khng tn ti cc du phy trong s.
s `s nu tn ti cc phn t c du phy t trc c tnh trong s.
Chng hn :
`(x y)
--> (x y)
(,a)
--> ((unquote a))
Gi s ta mun tr v gi tr trch dn quote ca mt s-biu thc s, ta vit :
(list quote y)
--> (a b c)
hoc vit gn hn :
`,y
; 3 du lin tip trc y
--> (a b c)
Ta c th vit hm kwote thc hin vic trn nh sau :
(define (kwote s)
`,s)
(kwote y)
--> (a b c)
Trong Scheme cn s dng hai k t lin tip ,@ (du phy ri du commercial at) t
trc mt s phn t trong mt s-biu thc c quasiquote. Khi mt phn t c hai du ny
ng trc, n c tnh gi tr nhng gi tr phn t ny phi l mt danh sch v ni dung
ca danh sch kt qu s thay th n.
`(x y ,x ,@y)
--> (x y 9999 a b c)
K t @ tng trng cho ch a trong append v ta c th nhn c cng mt kt qu
nh append :
(append `(x y ,x) y)
--> (x y 9999 a b c)
K thut ny thng c dng khi cn to sinh cc biu thc hm.
100
LP TRNH HM
101
MaxSoFar
MaxEndingHere
4. Bi ton sp xp dy vin bi ba mu
Bi ton sp xp dy cc vin bi ba mu, hay cn c gi l bi ton c ba mu (drapeau
franais) c pht biu nh sau : Cho trc mt dy cc vin bi nh s t 1 n N, mi
vin bi mang mt mu hoc xanh, hoc trng, hoc . Cn sp xp li cc vin bi theo th t
102
LP TRNH HM
bi xanh
bi trng
bi
Vng
cha x l
Hnh III.12. Bi ton sp xp dy cc vin bi ba mu.
S dng 3 ch s b, w v r phn cch 4 vng ca mng (xem hnh), thut ton sp xp
cc vin bi l x l vng cha c sp xp X :
w:= 1; b := 1; r := n;
while w <= r do
if W(w) then w:= w+1 elsif B(w) then begin
permute(b, w); b:= b+1; w:= w+1
end else begin while (R(r) and w < r) then r:= r-1;
permute(r, w); r:= r-1
end
Th tc Scheme sp xp dy cc vin bi ba mu s dng php lp :
(define (threecolor L)
(define (blue? x) (if (equal? 'b x) #t #f))
(define (white? x) (if (equal? 'w x) #t #f))
(define (red? x)
(if (equal? 'r x) #t #f))
(define (threecolor_itr L b w r)
(if (null? L)
(append b w r)
(let ((x (car L)) (y (cdr L)))
(cond
((blue? x)
(threecolor_itr y (cons x b) w r))
((white? x)
(threecolor_itr y b (cons x w) r))
(else
(threecolor_itr y b w (cons x r)))))))
(threecolor_itr L '() '() '()))
(threecolor '(b w w r b r b r w w r b b w))
--> '(b b b b b w w w w w r r r r)
5. Sp xp nhanh quicksort
Trong chng 1, ta xy dng thut ton quicksort sp xp nhanh cc phn t ca mt
danh sch theo th t khng gim vit bng Miranda. Sau y ta s minh ho bng Scheme.
103
u tin, ta xy dng hm phn chia partition cho php chuyn mt danh sch thnh
mt danh sch khc (theo th t ngc li) m phn t u ca n l danh sch con cha cc
gi tr nh hn hoc bng phn t trc pivot cho, danh sch con cn li cha cc gi tr
ln hn phn t trc. Hm c s dng hai danh sch mi lc u c hai u rng.
(define (partition L pivot Linf Lsup)
(cond ((null? L) (cons Linf Lsup))
((< (car L) pivot)
(partition
(cdr L) pivot (cons (car L) Linf) Lsup))
(else (partition
(cdr L) pivot Linf (cons (car L) Lsup)))))
(partition (6 4 7 8 5 9 2 3) 7 () ())
--> ((3 2 5 4 6) 9 8 7)
By gi xy dng hm quicksort gi quy vic chn phn t trc l phn t u
danh sch p dng hm phn chia, cc danh sch kt qu v phn t trc c rp li vi
nhau v tr v kt qu l danh sch c sp xp.
(define (quicksort L)
(if (or (null? L) (null? (cdr L)))
L
(let* ((pivot (car L))
(L1-L2
(partition (cdr L) pivot () ()))
(L1 (car L1-L2))
(L2 (cdr L1-L2)))
(append (quicksort L1)
(cons pivot (quicksort L2))))))
(quicksort (7 6 4 7 8 5 9 2 3))
--> (2 3 4 5 6 7 7 8 9)
Tm tt chng 3
Kiu d liu phc hp trong Scheme gm kiu chui, kiu vect, kiu b i, kiu
danh sch, kiu d liu th tc v kiu d liu cng.
Tt c cc kiu d liu ca Scheme u c gi l kiu s-biu thc.
Tn kiu
S
K t
Lgic
K hiu
B i
Chui
Vect
Th tc
Cng
V d
V t kim tra kiu
9
number?
char?
#\a ou #\space
boolean?
#t hoc #f
chip
symbol?
( 5 . 7 )
pair?
"Tom and Jerry"
string?
#( 5 3 12 Mickey 32 ) vector?
procedure?
----port?
104
LP TRNH HM
Kiu d liu b i c s dng xy dng kiu danh sch : mt danh sch hoc c
th rng, hoc c th l mt b i c cdr li l mt b i khc. Cc thnh phn ca
mt b i cng c th l cc b i.
Kiu danh sch c s dng ph bin trong Scheme. Mt danh sch c xem l mt
cu trc gm hai thnh phn : phn t u v phn danh sch cn li.
Bi tp chng 3
1. Gii thch cc biu thc sau y, sau tnh gi tr v so snh kt qu :
(cons 1 2)
(car (cons (cons 1 2) (cons 3 4)))
(cons (cons (cons (cons 1 2) 3) 4) 5)
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ())))))
(list 1 2 3 4 5)
(car (list 1 2 3 4 5))
(cdr (list 1 2 3 4 5))
(cadr (list 1 2 3 4 5))
(caddr (list 1 2 3 4 5))
105
(cdr (a))
(cdr week-list)
(car ((+ 4 1)))
(cdr ((+ 4 1)))
(cdr ((a) b))
(cdr ((a) (b)))
(cdr (a b))
5. Cho bit cc danh sch tng ng vi cc s sau :
a
a
b
d
1)
2)
106
LP TRNH HM
Tr :
Nhn :
Chia :
(a + bi)
(ac + bd)
(bc ad)
=
+
i , vi iu kin c2 + d2 0.
2
2
(c + di)
(c + d )
(c2 + d2 )
Lu tha :
a2 + b2 ,
b
a
trong :
= arctg
Cn bc hai : a + bi = x + yi ,
x=
a
+
2
a
b
+ , y=
2
2
Nu a > 0, tnh x v lc , y =
a
+
2
a
b
+
2
2
b
b
x , nu a < 0, tnh y v lc , x = y .
2
2
IV.1
S dng hm
107
108
LP TRNH HM
g
--> ERROR: #{Procedure 6703 f} (bo li trong Scheme48)
Hm g phi c gi tng t hm f c cng kt qu :
(g a)
--> (a a)
Gi s ta nh ngha li hm car bi mt tn khc nh sau :
(define first car)
first
--> ERROR: #<primitive-procedure car>
; sai v first l hm, khng phi bin
(first (list 1 2 3))
--> 1
Nh vy, nu mt hm c mt tham i f1 no c nh ngha trc , th mi
nh ngha dng :
(define (f2 x) (f1 x))
u c th vit ngn gn thnh :
(define f2 f1)
Ta c th m rng cho cc hm nhiu tham i :
(define (g2 x y z) (g1 x y z))
(define (g1 x y z) (+ x y z))
(procedure? g2) ; g2 l mt hm
--> #t
(g2 (+ 1 2) 4 5)
--> 12
Trong kiu d liu tru tng, hai li gi thc hin (* 2 2) v (* 3 3) ca dng
hm nhn (* num num) c ngun gc t khai bo hm :
* : number number number
t ta c nh ngha hm square :
(define (square x) (* x x))
Gi s ta cn xy dng hm sum-integer tnh tng cc s nguyn v hm sumsquare tnh tng cc bnh phng cc s nguyn gia hai s nguyn a v b cho. Ta c :
; Integer Integer Integer
(define (sum-integer a b)
(if (> a b)
0
(+ a (sum-integer (+ a 1) b)))
; Integer Integer Integer
(define (sum-square a b)
(if (> a b)
0
(+ (square a) (sum-square (+ a 1) b))))
K THUT X L HM
109
f '( x) = lim
dx0
f ( x + dx) - f ( x)
dx
110
LP TRNH HM
K THUT X L HM
111
112
LP TRNH HM
(else (+ 1
(apply max (map depth s))))))
(depth a)
> 0
(depth (a))
> 1
(depth (a (b c) ((d (e))) yes ()))
> 4
IV.1.3. Kt qu tr v l hm
Trong Scheme, hm c th c dng nh gi tr kt qu tr v ca mt hm khc. Chng
hn hm tnh o hm f ca mt hm f no va c nh ngha trn y c sa li ch
cn 2 tham i, gm tn hm cn tnh o hm f v s gia dx. Sau khi thc hin, hm tr v
mt hm khc ch tham i th ba, l x :
;derivative: (number number) number (number number)
(define (derivative f dx)
(define (estimation-derivative x)
(/ (- (f (+ x dx)) (f x)) dx))
estimation-derivative) ; ch tham i x mi thc hin tip
(define cube-prime (derivative cube .001))
(cube-prime 5)
--> 75.0150010000254
Tuy nhin ta c th gi trc tip :
((derivative cube .001) 5)
--> 75.0150010000254
Ch rng trong li gi trn, hm derivative c thc hin tr v hm ch
estimation-derivative mt cch d dang. Ch khi c tham i x, n mi thc
hin trn vn. Mt cch tng qut, khi c mt li gi :
(f arg1 ... argn)
th hm f cn c thc hin, f c th l mt dng hm (hay mt th tc) cn tnh ton tr
v mt hm khng cha tham i. Mt hm khng cha tham i c th dng ghi nh mt
php tnh cha thc hin ngay, m ch i sau tu theo yu cu c th gi s dng bng
cch cung cp tham i thc s. Ngi ta gi y l li ha tnh ton (evaluation promise).
Chng hn f l dng hm :
((if (= 1 2) + -) 3 4)
--> -1
((if #t + -) 3 4)
--> 7
y, dng hm (if e1 e2 e3) kim tra biu thc iu kin e1 tr v e2
(tng ng vi php ton + theo ) hoc tr v e3 (tng ng vi php ton ). Gi s
ta cn xy dng hm increment mt tham i x, tr v mt hm gia thm mt lng
vo x nh sau :
; increment: (number number) (number number)
K THUT X L HM
113
(define (increment x)
(define (inc y)
(+ x y))
inc) ; tr v tn hm ch tham bin th hai
((increment -7) 2)
--> -5
((increment 7) -2)
--> 5
Trong hai li gi trn, x ln lt ly cc gi tr 2 v 2, cn y ly 7 v 7.
IV.2
t = x, vi xVar l mt bin,
t = x.M, vi xVar l mt bin, M l mt hng , c gi l mt tru tng,
t = (M N) vi M v N l cc hng , c gi l mt p dng.
114
LP TRNH HM
app
app
x
K THUT X L HM
115
(lambda ()
(display 1)
(display < = )
(display 2)
(newline))
Khi gi s dng, khng cn a vo tham i thc s :
((lambda ()
(display 1)
(display < = )
(display 2)
(newline)))
--> 1 < 2
Tuy nhin, Scheme c dng c bit begin dng ni kt cc s-biu thc cng cho ra
kt qu tng t :
(begin
(display 1)
(display < = )
(display 2)
(newline))
--> 1 < =2
116
LP TRNH HM
(define (member? s L)
(if (null? L)
#f
(or (equal? s (car L))
(member? s (cdr L)))))
c th vit li nh sau
(define my-member?
(lambda (s L)
(if (null? L)
#f
(or (equal? s (car L))
((define (my-member? s L)
Hm sau y cho php chuyn i t ng dng c thnh dng mi s dng lambda
nh ngha mt hm bt k (ch trong nh ngha hm c s dng quasiquote) :
(define (oldform->newform def-no-lambda)
(let ((fname (caadr def-no-lambda))
(paramlist (cdadr def-no-lambda))
(Lbody (cddr def-no-lambda)))
`(define ,fname (lambda ,paramlist ,@Lbody))))
Vn dng hm oldform->newform, ta c th chuyn hm my-member? trn y v
dng nh ngha nh lambda nh sau :
(oldform->newform
(define (my-member? s L)
(if (null? L)
#f
(or (equal? s (car L))
(my-member? s (cdr L))))))
--> (define my-member? (lambda (s l)
(if (null? l) #f (or (equal? s (car l))
(my-member? s (cdr l))))))
Hm kt qu c th c s dng nh l cc hm thng thng. Chng hn, ta xy dng
li hm sum-integer tnh tng cc s nguyn gia a v b cho v d trc y nh sau :
(define (sum-integer a b)
(sum (lambda (x) x) a b)) ; li gi (sum f x y)
(sum-integer 0 9)
--> 45
(define (increment x)
(lambda (y) (+ x y)))
((lambda (x) (+ x 1)) 2)
--> 3
((lambda (x) (* x 5)) 10)
--> 50
Nh php tnh lambda, nh ngha hm tr nn gn hn v mt c php :
(define (double x) (+ x x))
l tng ng vi nh ngha s dng lambda :
K THUT X L HM
117
(define double
(lambde (x) (+ x x)))
(double 5)
--> 10
V d sau y lit k cc phn t mt danh sch :
(define (display-list L)
(for-each (lambda (x)
(display x) (display )) L))
(display-liste (a b c d e))
--> a b c d e
(display-liste (a (b ()) c (d) e))
--> a (b ()) c (d) e
Ta c th s dng lambda xy dng cc hm t hp mt ngi nh sau :
; compose: (T2 T3) (T1 T2) (T1 T3)
(define (compose f g)
(lambda (x) (f (g x))))
hoc nh ngha cch khc nh sau :
(define compose
(lambda (f g)
(lambda args
(f (apply g args)))))
((compose sqrt *) 12 75)
--> 30
Dng lambda xy dng hm incr nhn mt tham i x, tr v mt hm cho php
gia thm mt lng vo x (xem v d mc trc) :
; incr: (Number Number) (Number Number)
(define (x)
(lambda (y) (+ x y)))
((incr 12) 5)
--> 17
Ta nh ngha hm incr2 cho php tng ln 2 mt tham s :
(define incr2 (incr 2))
(define x 3)
(incr2 5)
--> 7
; Kt qu khng phi l 8.
IV.2.4.
118
LP TRNH HM
Nh vy :
(let ((x1 e1)
...
(xk ek))
body)
a 2 + b 2 , ta c th nh ngha hm b tr x2 nh lambda :
(define (pitagore a b)
(let ((sqr (lambda (x) (* x x))))
(sqrt (t(sqr a) (sqr b)))))
(pitagore 3 4)
--> 5.
Vi lambda, ta cng c th s dng k thut li ha tnh ton. Chng hn m phng
dng if tu theo iu kin thc hin cc vic khc nhau, ta c th nh ngha hm ch
nh sau :
(define (my-if x y z)
(if x (y) (z)))
(my-if (= 1 2) (lambda () #t) (lambda () #f))
--> #f
y cn s dng cc cp du ngoc gi cc li ha y v z.
(define (fact n)
(my-if (= n 0)
(lambda () 1)
(lambda () (* n (fact (- n 1))))))
(fact 5)
--> 120
nh ngha hm nhn :
(define (mult-n n)
(lambda (x) (* n x)))
((mult-n 9) 7)
--> 63
Gi s ta cn vit mt th tc to sinh cc s t nhin :
gennerator: 0 Integer
cho php lit k cc s nguyn ti mi li gi :
(gennerator)
--> 0
(gennerator)
--> 1
(gennerator)
--> 2
v.v..., ta s dng t bin trn cc phn t b i ca danh sch nh sau :
(define gennerator
K THUT X L HM
119
120
LP TRNH HM
(set! toto 3)
--> ERROR
S dng hm set! trn y nh ngha th tc to sinh cc s t nhin, ta gp li sai,
lun lun cho kt qu 0 :
(define (gennerator_e1)
(define curr -1)
(set! curr (+ curr 1))
curr)
(gennerator_e1)
--> 0
(gennerator_e1)
--> 0
nh ngha sau y cng sai, lun lun cho kt qu 0 :
(define (gennerator_e2)
(define curr (list -1))
(set-car! curr (+ (car curr) 1))
(car curr))
(gennerator_e2)
--> 0
(gennerator_e2)
--> 0
IV.2.5.
nh ngha hm nh tch lu kt qu
Ngi ta thng gp nhiu cu trc lp trnh ging nhau nhng p dng cho nhiu hm
khc nhau. Sau y, ta s xt mt v d p dng k thut tch lu kt qu nh hm list-it.
Ta nh ngha ln lt 4 hm thc hin cc vic sau :
1. Tnh tng gi tr ca mt hm p dng cho cc phn t danh sch
(define (sum h L)
(if (null? L )
0
(+ (h (car L )) (sum h (cdr L)))))
2. Tnh tch gi tr ca mt hm p dng cho cc phn t danh sch
(define (product h L)
(if (null? L)
1
(* (h (car L )) (product h (cdr L)))))
3. nh ngha li hm append ghp hai danh sch
(define (myappend L1 L2)
(if (null? L1)
L2
(cons (car L1) (myappend (cdr L1) L2))))
4. nh ngha li hm map cho hm mt bin h
(define (mymap h L)
K THUT X L HM
121
(if (null? L )
()
(cons (h (car L)) (mymap h (cdr L )))))
Gi s danh sch L = (x0, x1, ... , xn), ta c cu trc chung ca cc hm trn nh sau :
(sum h L)
= (+ (h x0) (+ (h x1) (+ ... (+ h xn) 0) ... )))
(product h L)
= (* (h x0) (* (h x1) (* ... (* h xn) 0) ... )))
(myappend L M)
= (cons x0 (cons x1 (... (cons xn L2) ... )))
(mymap h L)
= (cons (h x0 )(cons (h x1) (...(cons (h xn) ()) ...)))
Bng cch s dng mt hm f c i s th nht l danh sch L v i s th hai l kt
qu tch lu lin tip, gi tr cui cng ca hm s l :
(f x0 (f x1 (... (f xn R) ...)))
vi R l gi tr u.
T ta y dng hm list-it c tnh tng qut nh sau :
(define (list-it f L R)
(if (null? L )
R
(f (car L) (list-it f (cdr L) R))))
Hm list-it thc hin hm f ln lt cho cc phn t ca danh sch L, kt qu c
tch lu bt u t R. S dng hm list-it ny, ta c th gi thc hin tnh ton L ht
cng vic ca bn hm trn nhng c vit li nh sau (dng tip theo l v d p dng) :
; Hm (sum h L )
(list-it (lambda (x y)
(+ (h x) y)) L 0)
(list-it (lambda (x y) (+ (sqrt x) y)) (1 2 3 4 5) 0)
--> 8.38233
; Hm (product h L)
(list-it (lambda (x y)
(* (h x) y)) L 1)
(list-it (lambda (x y) (* (sqrt x) y)) (1 2 3 4 5) 1)
--> 10.9545
; Hm (myappend L1 L2)
(list-it cons L1 L2)
(list-it cons (a b c) (1 2))
--> (a b c 1 2)
; Hm (mymap h L)
(list-it (lambda (x y)
(cons (h x ) y)) L ())
(list-it (lambda (x y)
(cons (sqrt x ) y)) (1 2 3 4 5) ())
122
LP TRNH HM
IV.2.6.
K THUT X L HM
123
IV.2.7.
nh ngha quy cc b
124
LP TRNH HM
K THUT X L HM
125
IV.3
IV.3.1.
X l trn cc hm
Xy dng cc php lp
Hm append-map
126
LP TRNH HM
(flatting ())
> ()
2.
Hm map-select
Nhiu khi, ngi ta ch mun p dng hm map cho mt s phn t ca mt danh sch
tho mn mt v t p? no m thi, ngha l s dng map c la chn. Ta xy dng hm
map-select vi tng nh sau : s dng append-map v gn gi tr () cho cc phn
t khng tho mn v t, v do vy cc gi tr rng ny khng a vo danh sch kt qu cui
cng khi hm tr v.
(define (map-select f L p?)
(append-map
(lambda (x)
(if (p? x)
(list (f x))
()))
L))
(map-select (lambda (x)(/ 1 x))
(a 3 0 5 7 9)
(lambda (x)
(and (number? x) (not (zero? x)))))
> (1/3 1/5 1/7 1/9)
(map-select sqrt '(1 2 3 4 5) odd?)
> (1. 1.73205 2.23607)
3.
Cc hm every v some
K THUT X L HM
127
Mt cch tng t, ta xy dng hm some m rng php tuyn lgic or bng cch
thay th and bi or c dng:
(some f (e1 ... eN)) = (or (f e1) ... (f eN))
Hm some nh sau :
(define (some f L)
(if (null? L)
#f
(or (f (car L))
(some f (cdr L)))))
(some number? (1 3 a 5))
> #t
(some odd? (0 2 4 6 8))
> #f
IV.3.2.
128
LP TRNH HM
K THUT X L HM
129
IV.3.3.
T hp cc hm
130
LP TRNH HM
f : (Number T1) T2
ta nh ngha hm :
(define (f g) (g 2))
th li gi sau y l sai :
(f f)
--> ERROR: Wrong type to apply: 2
Tuy nhin nhng li gi sau y li cho kt qu ng :
(f list)
--> '(2)
(f sqrt)
--> 1.41421
IV.3.4.
Cc hm c s lng tham i bt k
Khi gi thc hin mt hm, b din dch Scheme t tng ng cc tham i hnh thc
vi cc tham i thc s. Sau y l cc dng nh ngha hm c nhiu tham i tu v
dng s dng php tnh lambda tng ng.
Dng nh ngha 1 :
(define (f x y z) ... )
tng ng vi :
(define f (lambda (x y z) ... )
K THUT X L HM
131
V d vi li gi :
(f 1 (+ 1 2) 4)
cc tham i hnh thc ln lt c nhn gi tr : x=1, y=3, z=4.
Dng nh ngha 2 :
(define (g . L) ... )
(ch g l tn hm, c du cch trc v sau du chm) tng ng vi :
(define g (lambda L ... ))
V d vi li gi :
(g 1 2 3 4 5)
tham i hnh thc l danh sch L c ly gi tr L = (1 2 3 4 5).
Dng nh ngha 3 :
(define (h x y . z) ... )
tng ng vi :
(define h (lambda (x y . z) ... )
V d vi li gi :
(h 1 2 3 4)
cc tham i hnh thc c ly gi tr nh sau : ((x y . z) c so snh vi (1 2 3
4), t , x=1, y=2, z=(3 4)
Trong 3 dng nh ngha trn y, hm f tha nhn ng 3 tham i, hm g c s lng
tham i tu , hm h phi c ti thiu 2 tham i. Ta c th d dng nh ngha hm list
theo dng 2 :
(define (list . L) L)
(list 1 2 3 4 5 6 7 8 9 0)
--> (1 2 3 4 5 7 8 9 0)
Ta c th m rng mt hm hai tham i nh ngha thnh hm c nhiu tham i. V
d, t hm cng + l php ton hai ngi, ta nh ngha hm add cng dn cc phn t ca
tham i l mt dy s nguyn tu :
(define (add . L)
; L : List(Number)
(define (add-bis L R)
(if (null? L)
R
(add-bis (cdr L) (+ (car L) R))))
(add-bis L 0))
(add 2 3 4 5)
--> 14
p dng hm apply, hm add c th nh ngha theo cch khc nh sau :
(define (add . L)
(if (null? L)
0
(+ (car L) (apply add (cdr L )))))
(add 1 2 3 4 5)
--> 15
(define L (1 2 3 4 5))
132
LP TRNH HM
(apply add L)
--> 15
Mt cch tng qut, cc dng nh ngha 2 v 3 c th vit di dng :
(define (f v0 v1 . . vn- 1 .vN) s)
tng ng vi dng lambda :
(define (f)
(lambda (L) s))
trong thn hm s l mt biu thc, L l mt danh sch cc i tu .
IV.4
IV.4.1.
Mt s v d
Phng php xp x lin tip
x 1
+ vi x0 = 1 :
2 x
K THUT X L HM
133
IV.4.2.
To th tc nh dng
^a hoc ^A
^%
^^
in k t ^
V d :
(format "Display ^^ with the format:^% x = ^s" (+ 1 2))
--> Display ^ with the format:
x = 3
(format "sin ^s = ^s^%" (/ 3.141592 2) (sin (/ 3.141592 4)))
--> sin 1.5708 = 0.707107
Th tc format-str khng tr v gi tr m tu theo ni dung chu i nh dng a
ra kt qu. Cch hot ng n gin nh sau : th tc duyt chu i nh dng v a ra m i k
t khng t trc m t k t c bit ^. Khi gp ^, th t c s x l ln lt tng trng hp
bi case. Tham s i trong hm b tr format-to ch nh v tr ca k t hin hnh.
(define (format str . L)
(let ((len (string-length str)))
(letrec ((format-to (lambda (i L)
(if (= i len)
(newline) ; 'indefinite
(let ((c (string-ref str i)))
(if (eq? c #\^)
(case (string-ref str (+ 1 i))
((#\a #\A)
(display (car L))
(format-to (+ i 2) (cdr L)))
((#\s #\S)
(write (car L))
(format-to (+ i 2) (cdr L)))
((#\%)
(newline) (format-to (+ i 2) L))
((#\^)
(display #\^)
(format-to (+ i 2) L))
134
LP TRNH HM
IV.4.3.
X l a thc
K THUT X L HM
135
IV.4.3.3. X l a thc
Cho trc a thc P = cxd + Q, cc php x l trn P bao g m :
Nhn a thc v i mt hng s a*P
So snh hai a thc
P1 ? P2
Cng hai a thc
P1 + P2
Nhn hai a thc
P1 * P2
1. Nhn a thc vi mt hng s
nhn hng s a vi a thc P, l y a nhn vi h s tr i ri sau ly a nhn vi a
thc cn li :
(define (mult-scalar-poly a P)
(cond ((zero? a) zero-poly) ; x l h s =0
((zero-poly? P) zero-poly) ; x l a thc 0
(else
136
LP TRNH HM
K THUT X L HM
137
(if (zero? c)
(add-poly Q1 Q2)
(cons-poly
d1
c
(add-poly Q1 Q2)))))
((< d1 d2) ; hai a thc khng c cng bc
(cons-poly d2 c2 (add-poly P1 Q2)))
(else
(cons-poly d1 c1 (add-poly Q1 P2))))))))
4. Php nhn hai a thc
Gi s :
P1 = (c1xd1 + Q1) v P2 = (c2xd2 + Q2)
khi , kt qu php nhn hai a thc P1 v P2 l :
(c1xd1 + Q1) (c2xd2 + Q2) = c1c2 x(d1 + d2) + (c1xd1 + Q1) Q2 + Q1 (c2xd2 + Q2)
Hm mul-poly c xy dng nh sau :
(define (mul-poly P1 P2)
(cond ((zero-poly? P1) zero-poly)
((zero-poly? P2) zero-poly)
(else
(let
((d1 (degree-poly P1))
(d2 (degree-poly P2))
(c1 (coeff-domin P1))
(c2 (coeff-domin P2))
(Q1 (remain-poly P1))
(Q2 (remain-poly P2)))
(if (zero-poly? Q1)
; Q1 = 0
(cons-poly (+ d1 d2) (* c1 c2)
(mul-poly P1 Q2))
; Q1 0
(add-poly
(add-poly
(mul-poly
(cons-poly d1 c1 zero-poly) P2)
(mul-poly Q1 Q2))
(mul-poly Q1 P2)))))))
138
LP TRNH HM
car
degree
cdr
coefficient
IV.4.3.5. a ra a thc
nhn th y cc a thc trn mn hnh, hay trn giy in, ta c th biu din chng nh
cc k t ASCII thng d ng. Chng hn n thc axn s c biu din dng ax^n.
K THUT X L HM
139
(print-poly Q))))))
(define (print-mono degree coeff)
(cond ((zero? degree) (display coeff))
((=1 degree) (display coeff) (display x))
(else (display coeff)
(display x)
(display ^)
(display degree))))
(define P1
(cons-poly 2 9 (cons-poly 1 27 (cons-poly 0 -10 0))))
P1
--> ((2 . 9) (1 . 27) (0 . -10))
(print-poly P1)
--> 9x^2+27x+-10
(add-poly P1 P1)
--> ((2 . 18) (1 . 54) (0 . -20))
(print-poly (add-poly P1 P1))
--> 18x^2+54x+-20
(print-poly (mul-poly P1 P1))
--> 81x^4+486x^3+1278x^2+-1350x+400
IV.4.4.
140
LP TRNH HM
thnh cng
thnh cng
Hnh IV.3. Tm li gi i trn cy trng thi.
tng c a thut ton nh sau :
G i thut ton depth-first-search vi trng thi u (nt gc) bit :
Nu trng thi u l ch (goal state), kt thc thnh cng
Ngc li, tip tc cc bc sau cho n khi thnh cng hoc tht bi :
a. T trng thi u cha phi l nt thnh cng, tip cn mt trng thi k tip, gi s
g i l S. Nu khng tip cn c trng thi k tip no, ghi nhn tht bi.
b. Gi li thut ton depth-first-search vi S l trng thi u.
c. Nu thnh cng, kt thc. Ngc li, tip tc vng lp.
K THUT X L HM
141
Ct j
8
Q
Q
7
Q
6
5
Q
Q
4
Q
3
2
Q
1 Q
1 2 3 4 5 6 7 8
Hng i
142
LP TRNH HM
Q
...
...
... Q
...
... Q
K THUT X L HM
143
144
LP TRNH HM
(some-solutions '())
--> (4 2 7 3 6 8 5 1)
Other solution (Y/N)?:
(5 2 4 7 3 8 6 1)
Other solution (Y/N)?:
(3 5 2 8 6 4 7 1)
Other solution (Y/N)?:
(3 6 4 2 8 5 7 1)
Other solution (Y/N)?:
(5 7 1 3 8 6 4 2)
Other solution (Y/N)?:
(4 6 8 3 1 7 5 2)
Other solution (Y/N)?:
#t
y
y
y
y
y
n
Tm tt chng 4
Php tnh lambda s d ng cc quy tc biu din hm quy v cho php tnh ton trn
hm tr v kt qu.
Gi tr m t biu thc lambda l m t hm nc danh, khi s dng tnh ton cn phi cung
cp cc tham i thc s tr v kt qu.
K thut lp trnh hm gii quyt hiu qu thut ton quay lui p dng cho bi ton 8
qun hu.
K THUT X L HM
145
Bi tp chng 4
1. Cho bit gi tr c a :
((lambda (x y z) (+ x y z)) 1 (+ 2 5) 3)
((lambda (L) ((lambda (x) (append L (list x))) 0)) '(a))
2. Cho cc nh ngha sau :
(define (f xl x2 x3 x4)
(lambda (m) (m xl x2 x3 x4)))
(define (g i z)
(z (lambda (u v w x)
(cond ((= i 1) u)
((= i 2) v)
((= i v) w)
(else '())))))
(define x (f -2 3 4 20))
(define y (list 3 5))
(define z (cons y (list 3 5)))
Cho bit kt qu tr v c a cc li gi sau y :
(g 0 x)
(g 4 1)
(g 3 x)
(eq? (cadr z) (car y))
(eq? (car z) (cdr z))
3. Cho :
U0 =V0 =1
Un = Un-1 + Vn-1
Vn = Un-1 * Vn-1
Dng letrec tnh gi tr ca U3 *V4 ?
4. Cc hm sau y lm g ? Tm phc tp ca chng ?
(define (mystery1 L)
(if (null? L)
()
(append (mystery1 (cdr L))
(list (car L)))))
(define (mystery2 L)
(if (null? (cdr L))
(car L)
(if (> (car L) (mystery2 (cdr Ll)))
(car L)
(mystery2 (cdr L)))))
5. Cho a thc bc n h s thc (hoc nguyn) m t bin nh sau :
P(x) = a0 + a1x + a2x2 + . . . + anxn
biu din P(x) trong Scheme, ngi ta thng s dng mt danh sch cc h s theo
mt chiu :
146
LP TRNH HM
CHNG III.
KIU CHUI.............................................................................................................................61
KIU D LIU VECT ...............................................................................................................64
KIU D LIU B I ..............................................................................................................65
III.3.1.
Khi nim tru tng ho d liu .......................................................................65
III.3.2.
nh ngha b i .....................................................................................................66
III.3.3.
t bin trn cc b i .........................................................................................68
III.3.4.
ng dng b i .......................................................................................................69
III.1
III.2
III.3
1.
2.
III.4
III.4.1.
III.4.2.
III.4.2.1.
Cc php ton c bn cons, list, car v cdr.................................................................76
III.4.2.2.
Cc hm x l danh sch.................................................................................................79
1.
Cc hm length, append v reverse...............................................................................................79
2.
Cc hm tham chiu danh sch......................................................................................................80
3.
Cc hm chuyn i kiu ................................................................................................................81
4.
Cc hm so snh danh sch ...........................................................................................................83
III.4.2.3.
Dng case x l danh sch..............................................................................................84
III.4.2.4.
K thut quy x l danh sch phng ......................................................................86
1.
Tnh tng cc phn t ca mt danh sch ....................................................................................86
2.
Danh sch cc s nguyn t 0 n n.............................................................................................86
3.
Nghch o mt danh sch .............................................................................................................87
4.
Hm append c hai tham i..........................................................................................................87
5.
Loi b cc phn t khi danh sch...............................................................................................87
6.
Bi ton tnh tng con.....................................................................................................................88
7.
Lp danh sch cc s nguyn t ....................................................................................................88
III.4.2.5.
K thut quy x l danh sch bt k ......................................................................89
1.
Lm phng mt danh sch .............................................................................................................89
2.
Tnh tng cc s c mt trong danh sch......................................................................................89
3.
Loi b khi danh sch mt phn t cc mc khc nhau .........................................................90
4.
Nghch o danh sch.....................................................................................................................90
5.
So snh bng nhau..........................................................................................................................91
III.4.3.
III.4.3.1.
Biu din danh sch bi kiu b i .............................................................................92
III.4.3.2.
Danh sch kt hp.............................................................................................................96
1.
Khi nim danh sch kt hp .........................................................................................................96
2.
S dng danh sch kt hp............................................................................................................97
III.4.3.3.
Dng quasiquote................................................................................................................98
III.4.4.
1.
2.
3.
4.
5.
CHNG IV.
IV.1
IV.1.1.
IV.1.2.
IV.1.3.
147
148
IV.2.6.
IV.2.7.
IV.3
IV.3.1.
1.
2.
3.
Hm append-map..........................................................................................................................125
Hm map-select.............................................................................................................................126
Cc hm every v some ................................................................................................................126
IV.3.2.
IV.3.3.
IV.3.4.
IV.4
MT S V D ............................................................................................................................. 132
Phng php xp x lin tip................................................................................... 132
To th tc nh dng ............................................................................................... 133
X l a thc................................................................................................................ 134
IV.4.1.
IV.4.2.
IV.4.3.
IV.4.3.1.
nh ngha a thc..........................................................................................................134
IV.4.3.2.
Biu din a thc.............................................................................................................134
IV.4.3.3.
X l a thc.....................................................................................................................135
1.
Nhn a thc vi mt hng s .....................................................................................................135
2.
So snh hai a thc.......................................................................................................................136
3.
Php cng a thc ........................................................................................................................136
4.
Php nhn hai a thc..................................................................................................................137
IV.4.3.4.
Biu din trong mt a thc.........................................................................................137
IV.4.3.5.
a ra a thc .................................................................................................................138
IV.4.4.
IV.4.4.1.
IV.4.4.2.
IV.4.4.3.
CHNG V.
CU TRC D LIU
a bit rng vic lp trnh ph thuc phn ln vo cch m hnh ho d liu ca bi ton
cn gii. Mi quan h gia thut ton v cu trc d liu trong lp trnh c
Niclaus Wirth, tc gi ngn ng lp trnh Pascal, a ra mt cng thc rt ni ting :
Cu trc d liu + Thut ton = Chng trnh
(Data structure + Algorithms = Programs)
V.1
Tp hp
Khi nim i tng ca tp hp c tnh trc gic, do nh ton hc ngi c G. Cantor a ra t nm 1985.
n nm 1902, nh trit hc ngi Anh B. Russell ch ra nhng nghch l ton hc (paradox) hay nhng
mu thun lgic trong l thuyt tp hp.
147
148
LP TRNH HM
CU TRC D LIU
149
150
LP TRNH HM
(intersection (1 2 3 4) (2 3 4 5 6) (4 5 6 7))
--> (4)
3. Php hiu ca hai tp hp
Cho hai tp hp E1 v E2, ta nh ngha php hiu ca hai tp hp E1\E2 nh sau :
(define (difference E1 E2)
(cond ; nu E2 rng th kt qu l E1
((null? E2) E1)
; nu E1 rng th kt qu l rng
((null? E1) ())
; nu E1 c phn t thuc E2 th b qua
((member (car E1) E2)
(difference (cdr E1) E2))
; tip tc sau khi gim kch thc tp hp E1
(else (cons (car E1)
(difference (cdr E1) E2)))))
(difference (1 2 3 4 5) (1 2))
--> (3 4 5)
4. Tm cc tp hp con ca mt tp hp
Cho trc tp hp E, ta cn tm tp hp tt c cc tp hp con (sub-set) ca E, k hiu 2E.
Chng hn cho E={ a, b, c } th 2 E ={ , {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} c tt c
8 phn t bao gm tp hp rng v bn thn tp hp E.
Nu tp hp E rng, th 2E cng rng. Nu E khc rng, xt mt phn t aE, khi c
cc tp hp con cha a v cc tp hp con khng cha a. u tin xy dng tp hp E\{a},
sau , chn a vo tt c cc tp hp con ca E\{a}. Ta c hm subset nh sau :
(define (subset E)
(if (null? E)
(list ())
(let ((Lremain (subset (cdr E))))
(append Lremain
(map (lambda (L)
(cons (car E) L))
Lremain)))))
(subset (a b c))
--> (() (c) (b) (b c) (a) (a c) (a b) (a b c))
V.2
Ngn xp
CU TRC D LIU
V.2.1.
151
fac(0)=1
fac(3)=?
fac(3)= ?
fac(1)=?
1*fac(0)
fac(2)=?
2*fac(1)
2*fac(1)
3*fac(2)
3*fac(2)
3*fac(2)
1*1
2*fac(1)
2*1
3*fac(2)
3*fac(2)
fac(1)= 1
fac(2)=2*1=2
3*2
fac(3)= 3*2
6
fac(3)= 6
152
LP TRNH HM
b)
...
S
a)
C nhiu cch biu din cu trc d liu kiu ngn xp trong Scheme. Phng php t
nhin hn c l biu din ngn xp di dng mt danh sch m cc thao tc b sung v loi
b mt phn t c thc hin mt u danh sch. Trong Scheme, mi ln b sung mt
phn t vo danh sch ko theo vic to ra mt b i (dotted pair) mi.
Hnh V.2. Hot ng b sung (a) v loi b (b) mt phn t ca ngn xp.
Ta c cc hm Scheme nh sau :
(define (empty-stack) ())
(define empty-stack? null?)
(define (push-stack x S)
(cons x S))
(define (pop-stack S)
(if (empty-stack? S)
(display ERROR: stack is empty!)
(cdr S)))
(define (top-stack S)
(if (empty-stack? S)
(display ERROR: stack is empty!)
(car S)))
Ta thy cc thao tc trn ngn xp tng t i vi danh sch. Sau y l mt s v d
minh ho thao tc trn ngn xp s dng cc hm c ph hp vi ca1c tin trong c t
trn y :
(empty-stack? (push-stack 'a (empty-stack)))
--> #f
(pop-stack (push-stack a (1 2 3)))
--> (1 2 3)
CU TRC D LIU
153
Ta s s dng mt ngn xp biu din vng nh trung gian. Trong chng trnh c s
dng mt hm cc b loop c cc k t lin tip t dng vo. Ch s i l k t ang c
th i.
(define (lineeditor str)
(let ((L (string-length in-str)))
(letrec ((loop
(lambda (i buffer)
(if (< i L)
(let ((readchar (string-ref in-str i)))
(case readchar
((#\#) (loop (+ i 1) (pop-stack buffer)))
((#\$) (loop (+ i 1) (empty-stack)))
((#\.) (map (display (reverse buffer)))
(else (loop (+ i 1)
(begin
(display "ERROR: dot is the end of
command!")
(newline))))))
(loop 0 (empty-stack)))))
(lineeditor "XY$abce#def.")
--> abcdef
154
LP TRNH HM
Ngi c c th pht trin trnh son tho trn y x l cc tnh hung son tho vn
bn phc tp hn.
:
:
:
:
:
Stack!(T)
Stack!(T)
boolean
T Stack!(T) Stack!(T)
Stack!(T)
-/ T
Stack!(T)
-/ T
CU TRC D LIU
155
...
stack!
bob
Hnh V.3. Hot ng b sung mt phn t vo ngn xp.
Ta tip tc xy dng hm xem v loi b phn t nh ca ngn xp :
(define (top-stack! S)
(if (empty-stack!? S)
(begin
(display "ERROR: stack! is empty!")
(newline))
(cadr S)))
(top-stack! S1)
--> 'jim
(define (pop-stack! S)
(if (empty-stack!? S)
(begin
(display "ERROR: stack! is empty!") (newline))
(let ((top (cadr S)))
(set-cdr! S (cddr S))
top)))
(pop-stack! S1)
--> 'jim
(top-stack! S1)
--> bob
stack!
Hnh V.4. Hot ng loi b mt phn t khi ngn xp.
Sau y l mt cch khc s dng k thut truyn thng ip xy dng cc hm x l
cu trc d liu kiu ngn xp trong Scheme.
(define (make-empty-stack!)
(let ((content '()))
(lambda (message . Largt)
(case message
156
LP TRNH HM
CU TRC D LIU
(9 + 2) *
157
52
Tuy nhin, trong b nh, cc biu thc c biu din dng cy (ta s xt cu trc cy
trong mc tip theo). Khi tnh ton, biu thc s hc dng cy nh phn (cho cc php ton
hay hm, gi chung l ton t, c ti a hai ton hng) c a ra thnh mt chui k t
dng hu t (dng k php Ba Lan) nh sau :
9 2 + 52
*
Lc ny cc du ngoc khng cn na do cc biu thc dng hu t thng khng nhp
nhng (un-ambiguous). Khi c biu thc t tri qua phi, ta gp cc ton hng trc khi gp
mt ton t. Nu p d ng ton t ny cho cc ton hng trc , ta nhn c m t kt qu
l m t ton hng mi v qu trnh tip t c theo ng ch vo trc ra sau. Do vy,
ngi ta s d ng m t ngn xp m phng qu trnh tnh ton biu thc : cc ton hng
(c c t biu thc hu t, ln lt t tri qua phi) c y vo ngn xp cho n khi
gp ton t. Thc hin php ton vi cc ton hng ly ra t ngn xp ri li y kt qu
vo ngn xp cho n khi ht biu thc v ly kt qu nm nh ngn xp.
Sau y ta xy dng hm tnh mt biu thc s hc dng hu t (ngi c c th tm c
cc gio trnh Cu trc d liu v thut ton hiu chi tit h n). Chng trnh s dng
ngn xp t bin x l cc php ton s hc +, -, *, / v hm sqrt :
(define (evaluation postfix-expr)
(let ((pile (make-empty-stack!)))
(letrec ((compute
(lambda (exp)
(if (null? exp)
(top-stack! pile)
(let ((s (car exp)))
(if (number? s)
(push-stack! s pile)
(begin
(case s
((sqrt)
(let ((v (pop-stack! pile)))
(push-stack! (sqrt v) pile)))
((+)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! pile)))
(push-stack! (+ v1 v2) pile)))
((*)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! pile)))
(push-stack! (* v1 v2) pile)))
((-)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! piler)))
(push-stack! (- v1 v2) pile)))
((/)
(let ((v2 (pop-stack! pile))
(v1 (pop-stack! pile)))
(push-stack! (/ v1 v2) pile))))
(compute (cdr exp)))))))))
(compute postfix-expr))))
158
LP TRNH HM
V.3
Tp
u hng
B sung
Cui hng
CU TRC D LIU
159
(begin
(display "ERROR: file is empty!")
(newline))
(cdr F)))
(define (top-file F)
(if (empty-file? F)
(begin
(display "ERROR: file is empty!")
(newline))
(car F)))
Ta nhn thy rng vic s dng danh sch l khng hp l khi kch thc tp tng ln v
lnh appenf trong hm push-file s gy ra chi ph tnh ton ln.
V.3.2. V d p dng tp
Sau y ta xt m t v d p d ng cu trc d liu kiu tp va xy dng. Gi s cho trc
mt danh sch L gm cc s nguyn tng ngt v mt s nguyn N, ta cn tnh s lng cc
cp s (x, x + N) vi x v N c mt trong danh sch.
Chng hn nu L = (0 2 3 4 6 7 8 9 10 12 13 14 16 20) v N = 8, th ta tm m c b n
cp s tho mn nh sau : (2, 10), (4, 12), (6, 14) v (12, 20).
Phng php n gin nht c tnh trc quan l vi mi s x ly t L, tin hnh tm kim
cc s x + N trong L . Tuy nhin ph ng php ny c chi ph ln v ta phi duyt qua duyt
li nhiu ln danh sch L. Sau y l phng php ch cn duyt mt ln danh sch L.
Ta s dng tp F c di < N v kim tra mi phn t x ca F :
Nu tp F rng th ta ch vic thm vo phn t x.
Nu top l ph n t u tp v x > top + N, ta chc chn r ng ta khng th cn tm c
phn t y no c a F m y = top + N v do vy ta phi loi b F.
Nu x = top + N, ta lo i b x khi L thm x vo F v m cp tho mn (x, top).
Nu x < top + N, ta ch loi b x khi L thm x vo F.
Ch ng trnh Scheme nh sau :
(define (pair-count L N)
(letrec ((count
(lambda (L result F)
(cond ((null? L) result)
((empty-file? F)
(count
(cdr L)
result
(push-file (car L) F)))
(else
(let
((difference (- (car L) (top-file F))))
(cond
((< N difference)
(count L result (pop-file F)))
((= N difference)
160
LP TRNH HM
(count
(cdr L)
(+ result 1)
(pop-file (push-file (car L) F))))
(else
(count
(cdr L)
result
(push-file (car L) F))))))))))
(count L 0 (empty-file))))
(pair-count '(0 2 3 4 6 7 9 10 12 13 14 16 20) 8)
--> 4
V.3.3. Tp t bin
Gi s gi File !(T) cu trc d liu kiu tp t bin (mutable file), ta c t kiu tru
tng nh sau :
Types File!(T)
functions
empty-file :
File!(T)
empty-file!?
: File!(T) boolean
push-file! : T File!(T)
File!(T)
pop-file! : File!(T)
File!(T)
top-file! : File!(T)
- T
axioms
var s: T, F: File!(T)
empty-file!?(empty-file!) = true
empty-file!?(push-file! (s, F)) = false
top-file!(push-file! (s, F)) =
if empty-file!?(F) then s else top-file!(F))
if empty-file!?(F)
then pop-file!(push-file!(s, F) = s
if not (empty-file!?(F))
then pop-file!(push-file!(s, F) =
push-file!(s, pop-file!(F))
CU TRC D LIU
161
bob
u tp
jim
ui tp
file
a) N i dung tp (ann bob jim)
file
b) Tp r ng
162
V.4
LP TRNH HM
Cy
Gc
Cnh
Nt trong
L
(nt ngoi)
Cy con g c b f
ng i
t a n h,
qua e
V.4.1.
V.4.1.1.
Cy nh phn
Kiu tru tng cy nh phn
CU TRC D LIU
163
define
4
quote
cons
a ) x + (y 3*z)/4
quote
a
b
b ) (define L (cons a b))
164
LP TRNH HM
V.4.1.2.
3
5
empty-tree empty-tree)
empty-tree empty-tree))
empty-tree empty-tree))
5 ()) 3 ())
CU TRC D LIU
165
1
2
empty-tree)
empty-tree))
empty-tree))
166
LP TRNH HM
(if (pair? A)
(caddr A)
;hay (cadr A) trong trng hp biu din tit kim
()))
(define (leaf? A)
(not (pair? A)))
; V d to mt cy nh phn c 3 nt :
(create-tree 1
(create-tree 2 empty-tree empty-tree)
(create-tree 3 empty-tree empty-tree))
--> (1 2 3)
V.4.1.3.
Mt s v d lp trnh n gin
1. m s lng cc nt c trong mt cy
Xy dng hm size c dng hm nh sau :
; size : BinTree(T) Integer
(define (size A)
(if (empty-tree? A)
0
(+ 1 (size (left A)) (size (right A)))))
; m s lng cc nt c trong cy A Hnh V.10
````:
(size A)
--> 5
2. Tnh cao ca mt cy
cao ca mt cy khc r ng l s cnh t i a ni gc c a cy vi cc l ca n.
Theo quy c, cao ca mt cy rng c th l 1. Xy dng hm height c dng nh sau :
; height : BinTree(T) Integer
(define (height A)
(if (empty-tree? A)
-1
(+ 1 (max (height (left A)) (height (right A))))))
; cao c a cy A Hnh V.10.:
CU TRC D LIU
167
(height A)
--> 2
n = 2h+1 1
Cy suy thoi :
n=h +1
C tt c
Cn2n
cy nh phn kch thc n,
(n + 1)
V.4.1.4.
Duyt cy nh phn
168
LP TRNH HM
(if (empty-tree? A)
()
(append (list (root A))
(pre-nodes (left A))
(pre-nodes (right A)))))
; Duyt cy nh phn theo th t gia :
(define (inf-nodes A)
(if (empty-tree? A)
()
(append (inf-nodes (left A))
(list (root A))
(inf-nodes (right A)))))
; Duyt cy nh phn theo th t sau :
(define (post-nodes A)
(if (empty-tree? A)
()
(append (post-nodes (left A))
(post-nodes (right A))
(list (root A)))))
minh ho cc thu t ton duyt cy trn y, gi s A l cy c cho nh hnh sau :
1
2
4
3
5
CU TRC D LIU
169
V.4.2.1.
V.4.2.2.
170
LP TRNH HM
V d A l cy t ng qut nh sau :
1
2
3
5
4
6
V.4.2.3.
Mt s v d v cy tng qut
Nguyn tc x l cy tng qut A nh sau : trc tin kim tra danh sch cc cy con l
rng c a A c rng khng ? Nu r ng th dng v tr v kt qu. Nu khc r ng th ln lt
x l cc cy con ca A.
1. m s lng cc nt trong cy
Hm tree-size m s lng cc nt trong cy :
; tree-size : Tree(T) Integer
(define (tree-size A)
(define (size-forest F)
CU TRC D LIU
171
(if (null? F)
1
(+ 1 (tree-size (car F)) (size-forest (cdr F)))))
(size-forest (forest A)))
(define A '(1 2 (3 5) (4 6 7)))
(tree-size A)
--> 13
2. Tnh cao ca cy
V.4.2.4.
Chin lc duyt cy tng qut tm danh sch cc nt g m php duyt theo th t trc
v php duyt theo th t sau, khng c th t trung t .
Thut ton duyt cy theo th t trc : ti mi bc quy, s d ng lnh append
to danh sch l nt g c v kt qu duyt cc cy con c a rng :
; pre-nodes: Tree(T) List(T)
(define (pre-nodes A)
(define (nodes-forest F)
(if (null? F)
()
(append (pre-nodes (car F))
(nodes-forest (cdr F)))))
(append (list (root A)) (nodes-forest (forest A))))
Thu t ton duyt cy theo th t sau : tng t php duyt theo th t trc nhng php
ghp theo th t ngc li :
; post-nodes: Tree(T) List(T)
(define (post-nodes A)
(define (nodes-forest F)
(if (null? F)
'()
(append (post-nodes (car F))
(nodes-forest (cdr F)))))
(append (nodes-forest (forest A)) (list (root A))))
172
LP TRNH HM
3
6
4
7
8
9
10
11
Xy dng cy c php
v.v ...
; Hm tr v cy con th nht vi iu kin cy cho c ti thiu 1 con
CU TRC D LIU
173
v.v ...
Chng hn xy dng cy c php cho biu thc Scheme
(define L (list ann tom bob))
nh sau :
(define T
(create2 define L (create3 list ann tom bob)))
T
--> (define L (list ann tom bob))
(son2 (son2 T))
--> tom
define
L
list
ann
tom
bob
V.4.3.2.
V d : o hm hnh thc
174
LP TRNH HM
Bi tp chng 5
1. Cho trc m t nh ngha hm nh sau :
(define (less k x)
(cond ((null? x) ())
((< (car x) k) (cons (car x) (less k (cdr x))))
(else (less k (cdr x)))))
Hy cho bit gi tr tr v ca cc li gi sau y, gii thch ti sao :
(less 5 ())
(less 5 (4 5 6))
(less 5 (7 3 6 2))
Vit li hm trn nhng ch s dng if m khng s d ng cons, ng thi loi b biu
thc tha (less k (cdr x)) ?
2. Vit hm chuyn i cc s nh phn (h c s 2) ra thp phn (h c s 10) v ngc l i
(ch cc tham bin l cc s nguyn) theo gi nh sau :
(binary->decimal 10001)
--> 17
(decimal->binary 17)
--> 10001
3. Vit hm chuyn i c s tr v kt qu l hm chuyn i cc s nh phn ra thp
phn v ngc li theo gi nh sau (c th nh ngha cc hm b tr) :
((base-converse 2 10) 10001)
--> 17
((base-converse 10 2) 17)
--> 10001
4. Vit hm (converse P N) chuyn i s thp phn N bt k sang s h c s P, vi
P 36 (s trong h c s P c vit b i P ch s 0..9A..Z) theo gi nh sau :
CU TRC D LIU
175
(converse 16 17)
--> 11
(converse 8 17)
--> 21
(converse 2 17)
--> 10001
5. Xy d ng cu trc d liu kiu ngn xp t bin nhng c kch thc gi hn, ngha l
s phn t c a ngn xp khng vt qu MaxNum. C th biu din ngn xp bi mt
vector, trong s dng m t s nguyn lm ch s nh ca ngn xp.
6. Xy dng hm tnh biu thc s hc d ng hu t s d ng ngn xp thng thng.
7. T cch s d ng k thut truyn thng ip xy d ng cc hm x l ngn xp trong l
thuyt, hy vit thm cc hm cho php a ra xem ni dung c a ngn xp vi thng
ip view-content.
8. Vit li hm nodes khng s d ng lnh append tr v danh sch tt c cc nt c a
cy nh phn.
9. Vit cc thut ton duyt cy nh phn theo chiu rng.
10. Vit cc thut ton duyt cy nh phn theo chiu su.
11. Trong mt nh ga, ngi ta cn sp xp cc toa tu trn cc ng ray nh hnh v di
y. S d ng mt ngn xp biu din ho t ng sp xp cc toa tu trn cc ng
ray, hy cho bit cc thao tc cn phi thc hin sao cho cc toa tu c sp xp theo
th t 5 4 3 2 1 ?
R1
2
R2
176
LP TRNH HM
15. T danh sch 8 s thc X1, Y1, X2, Y2, X3, Y3, X4, Y4 ln lt l to ca bn im A, B,
C, D tng ng trong mt mt phng to . Hy cho bit ba im A, B, C c lp thnh
m t tam gic khng ? Nu ABC l m t tam gic, hy xt xem :
1. im D c nm bn trong tam gic ny khng ?
2. Tnh din tch v chu vi c a tam gic
3. Tnh khong cch t D n ba im A, B, C.
16. Trong mt phng to , phng trnh ng d c ca mt ng thng c dc m v i
qua im P c to (x1, y1) l : y - y1 = m(x - x1). T danh sch gm d c v to
im c a hai ng thng, hy kim tra xem chng c giao nhau hay song song vi nhau.
Nu chng c giao nhau, kim tra chng c vung gc vi nhau hay khng ?
17. T mt s thc dng R v mt s nguyn d ng MAX, hy tm mt phn s gn s R
nht trong s cc phn s c dng P/Q vi QMAX ?
18. Cho m t ma trn cc s nguyn N N phn t gi s c biu din di d ng m t danh
sch gm N phn t l cc danh sch con, m i danh sch con biu din mt hng N phn
t, lin tip hng n n i tip hng kia. Hy xt xem ma trn cho c l ma trn g :
a) Ma trn tam gic trn-phi (c cc phn t nm pha d i ng cho chnh bng 0) ?
b) Ma trn tam gic di-phi (c cc phn t nm pha trn ng cho chnh b ng 0) ?
c) Ma trn tam gic trn-tri (c cc phn t nm pha di ng cho ph b ng 0) ?
d) Ma trn tam gic di-tri (c cc phn t nm pha trn ng cho ph bng 0) ?
e) Ma trn y (khng ri vo mt trong 4 trng hp tam gic trn) ?
f) Tm mt cch biu din t i u cho cc ma trn tam gic ?
VI.1
VI.1.1.
Mi trng
Mt s khi nim
177
178
LP TRNH HM
u tin, cc biu thc e1, ..., eN c tnh ng thi trong mi trng hin hnh
nhn c cc gi tr v1,..., vN. tng ng. Sau , thn ca let c tnh trong mi trng
mi nhn c b ng cch thm cc khi lin kt x1 v1, ..., xN vN vo mi trng hi n
hnh nh hnh di y :
x1
...
...
y1
v1
...
...
w1
xN
vN
Mi trng
B nh
gi tr ca x
x
a ch ca x
MI TRNG V CP PHT B NH
179
180
LP TRNH HM
Biu thc c a f
Mi trng nh ngha c a f
Hnh VI.3. Cp con tr biu din mt php ng.
Hnh v m t cch biu din bn trong c a nh ngha hm nh php tnh lambda. Vng
nh gn vi m t gi tr ca bin cha hai con tr : con tr a ch c a biu thc lambda nh
ngha hm v a ch ca mi trng nh ngha hm.
Biu thc ca f
(lambda (x)
(+ a x))
Mi trng nh ngha c a f
a
10
MI TRNG V CP PHT B NH
181
Biu thc ca f
(lambda (x)
(+ a x))
Mi trng nh ngha c a f
a
Tuy nhin :
(eq? car (lambda (L) (car L)))
--> #f
k c khi hai i tng cn so snh t ra y ht nhau :
(eq? (lambda (x) x) (lambda (x) x))
--> #f
Hai hm f v g c gi bng nhau theo ngha rng (extent equal) nu chng c cng
min xc nh v cng nhn nh ng gi tr nh nhau trong min ny. Kiu bng nhau ton h c
ny khng kim nh c khi min xc nh l v hn. V vy, v t so snh equal? cng
khng dng c so snh trn cc hm :
(equal? car (lambda (L) (car L)))
--> #f
182
LP TRNH HM
VI.1.2.5. Phm vi ng
Gi s ta cn nh ngha cc hm nh sau :
(define (f a)
(+ a (g 5)))
(define (g x)
(+ a x))
Khi gi n f hoc g, sai s u xut hin do bin a khng phi l bin ton c c :
(f 1)
--> ERROR: undefined variable: a
(g 1)
--> ERROR: undefined variable: a
Khi , g i n f ho c g u c kt qu :
(f 1)
--> 16
(g 1)
--> 11
th phm vi lin kt gia mt tham bin hnh thc xi vi gi tr ei l thn body c a biu thc
lambda, tng t dng let :
(let ((x1 e1)
...
(xN eN))
body)
MI TRNG V CP PHT B NH
183
*
-
Hm + c nh ngha
20
21
22
Kh i lin kt to ra b i let*
Mi trng mc thn ca let*
184
LP TRNH HM
Lin kt a cho 10 c phm vi trong thn c a let, nh ng trong thn ny, lnh set!
to ra m t php ng ton cc thu np lin kt ny vo trong mi trng c a n.
Sau khi thc hin let, li g i hm f ko theo vic s dng lin kt a cho 10 tnh li
gi tr ca f trong thn hm. c im ny lm cho vic bin dch cc chng trnh
Scheme tr nn rc r i.
MI TRNG V CP PHT B NH
185
hoc c th thay i car c cng tnh cht nh car c a ngn ng Common Lisp : phn
t u c a mt danh sch rng khng gy ra sai st m tr v mt danh sch rng :
(define car
(lambda (x)
(if (null? x)
()
(head x))))
(car ())
--> ()
(car '(a b c))
--> a
car
car c a Scheme
head
B nh
VI.2
Cp pht b nh
186
LP TRNH HM
current-value 0)
(rtz) 0)
(add n)
current-value n))
; cha ch y c
(value) current-value)
; lun lun tr v 0
MI TRNG V CP PHT B NH
187
188
LP TRNH HM
(cond
((eq? m balance)
S)
((eq? m add!)
(lambda (n) (set! S (+ S n))))
((eq? m withdrawal!)
(lambda (n)
(if (> n S)
(error withdrawals upper than balance))
(set! S (- S n))))))
switch)
; T ti khon C, g i create-account vi thng ip balance
(define (balance C) (C balance))
; T ti khon C, g i create-account vi thng ip add!
(define (add! C n) ((C add!) n))
; T ti khon C, g i create-account vi thng ip withdrawal!
(define (withdrawal! C n) ((C withdrawal!) n))
MI TRNG V CP PHT B NH
189
VI.3
190
LP TRNH HM
MI TRNG V CP PHT B NH
191
(define (f y)
(define x 2)
(+ x y))
s gy ra :
Hm create-account c g i trong mi trng (C, C)
C = {S = 1000}, C l khung ton c c
Sau khi thc hin (define (switch m) ... ), th
C = { switch = P, S = 1000 }, vi
P = [ cc lnh ca switch ; (C, C) ]
Hm create-account tr v gi tr ca switch, l P
Bin account c gi tr l hm :
cng c ngha l :
(account balance)
192
LP TRNH HM
C = { switch = P, S = 900 }
s d ng cc x l cn i ti khon sau ny, l add! v withdrawal! trong hm
account, S c gi tr 900.
VI.4
Vo/ra d liu
VI.4.1. Lm vic vi cc tp
Tp l phng tin lu tr mt dy cc d liu bt k trn mt thit b nh ngoi nh a
mm, a cng, CD-ROM, bng t, v.v... Tp c t tn theo quy c ca h iu hnh
d dng truy cp n trong h thng th mc t chc kiu phn cp. lm vic (c/ghi)
vi tp, cn thit lp s lin kt gia tp vi mt h thng Scheme. S lin kt ny to ra mt
lu ng hay dng d liu (data flow) gia tp v cc hm vo/ra c a Scheme.
Khi c ra (read) m t tp, cn lin kt tp ny v i dng vo (input flow) c a Scheme
cung cp cc hm c. Khi ghi ln (write) mt tp, cn lin kt tp ny vi dng ra (output
flow) c a Scheme cung cp cc hm a (ghi) ra.
Scheme c cc hm lin kt m t dng d liu vi m t tp nh sau :
MI TRNG V CP PHT B NH
193
(open-input-file filename)
--> lin kt dng vo vi tp filename c mt trn thit b nh.
(open-output-file filename)
--> lin kt dng ra vi tp filename cn to ra.
194
LP TRNH HM
Ho c s d ng kt tp vi dng vo :
(call-with-input-file mailto.txt
(lambda (flow)
(let ((s (read flow))) s)))
--> university
MI TRNG V CP PHT B NH
195
196
LP TRNH HM
((loop
(lambda (Lcar)
(let ((c (peek-char flow)))
(if (separator? c)
(list->string (reverse Lcar))
(loop (cons (read-char flow) Lcar)))))))
(read-separator separator? flow)
(loop ())))
(lambda(char)
(eq? #\newline char))
VI.4.3. Ghi ln tp
1. Cc hm ghi ln tp
MI TRNG V CP PHT B NH
197
(newline flow)
; ghi k t qua dng
(display
41, Le Duan St., Danang City, Vietnam flow)
(newline flow)
; ghi k t qua dng
(display
Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683
flow)
(close-output-port flow)
198
LP TRNH HM
A
A
B
A
C
C
A
to
to
to
to
to
to
to
B
C
C
B
A
B
B
Bi tp chng 6
1. Cho bit gi tr tr v t :
((lambda (a)
(let ((a 1))
((f (lambda (x) (+ a x))))
(f a))) 5)
--> ?
2. V cc khi lin kt cho chu lm vic sau y
(let*((x 2) (y (+ x x)) (z (* x y)))
(let ((x y) (y x) (+ *))
(+ x y z)))
MI TRNG V CP PHT B NH
199
4. Vit hm :
a) Tnh s lng cc k t trong m t tp ?
b) Tnh s lng cc k t khng phi l k t phn cch (khng phi l cc du cch,
nh y ct, hay qua dng) ?
5. Vit hm so snh hai tp vn b n tr v dng vn b n u tin khc nhau gia hai tp ?
6. T bn s nguyn dng A, B, C, D sao cho 1A31, 1B12, 1000C2000, 1D7
( ngha c a b n s ny l ngy A thng B n m C l ngy th D, trong D=1 l ngy
Ch nht, D=2 l ngy th Hai, ... D=7 l ngy th By) v ba s nguyn dng A1, B1,
C1 tho mn cc iu kin tng ng i vi A, B, C, hy cho bit ngy A1 thng B1 nm
C1 l ngy th m y ? Ch n cc nm nhun.
7. Cho s nguyn d ng n v bin thc x thay i t 0 n 1 vi b c tng l h = 0.01.
sin
x dx
vi n chn, n 2
vi n l, n 3
vi n = 2, 3, 4, ...
vi n = 0, 1, 2, ...
Ln+2(x) = xLn+1(x) -
(n + 1)2
Ln (x)
(2n + 1)(2n + 3)
vi n = 0, 1, 2, ...
200
LP TRNH HM
y=
x +
x + ... +
c n > 1 du cn
fn = fn-1 + fn-2 vi n 2
Vit v t kim tra mt s nguyn m cho trc c phi l s Fibonaci khng ?
15. Cho s n nguyn dng, hy tm gi tr an c xc nh t dy s nguyn a1, a2, ..., an
nh sau :
a1 = 5
a2 = 8
an = an-1 + 3 * (n1)
16. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01. Tnh t ng :
1+
x2
2 x4
2 4 x6
+
+
+ ...
2
3 4
3 5 6
+
+
+ ...
2 3
2 4 5
2 4 6 7
vi chnh xc cho trc, chng hn = 10-5.
x+
MI TRNG V CP PHT B NH
201
1 1 1
1
= 1 + +... cho n khi
< 10 4
4
3 5 7
2n 1
x2 x4 x6
x 2n
+ + +...+
+...
2! 4! 6!
(2n)!
cho n khi
x 2n
< 105
(2n)!
y = 0
khi x = 1
log (x 2 1)
khi x > 1
2
25. Dy s nguyn a0, a1, a2... an,... xc nh bng quy np nh sau :
a0 = 1
an = n an-1
nu n chn
an = n + an-1 nu n l
(n = 2, 4, 6...)
(n = 1, 3, 5...)
nu aq - bp = 0
nu
a
b
c
= = .
p
q
r
nu xi + yi A
(xi + yi)2
nu xi + yi 0.
202
LP TRNH HM
H1(x) = 2x
Hn(x) = 2xHn-1(x) - 2(n-1)Hn-2(x)
29. Cho s thc x thay i t 0 n 1 vi bc tng l h = 0.01 v n nguyn dng, bng cch
s dng c hai phng php quy v lp, tnh gi tr c a a thc Laguerre bc n (a = 0)
c cho bi cng thc truy hi nh sau :
Ln+2(x) = (x 2n 3)Ln+1(x) - (n + 1)2 Ln(x)
vi n = 0, 1, 2, ...
1
Arc cos(
3
q
2
p3
27
A=2
p
3
x1 = Acos
2
x 2 = Acos +
x 3 = Acos
31. Cho N l mt s d ng, tnh cn b c hai N theo phng php Newton (khng s d ng
hm sqrt). Ni dung phng php : Nu gi s l gi tr gn ng c a cn b c hai c a n
N
N
chnh xc cn thit. Gi s ch n = 10 6, khi : 2 1 <
s
MC LC
CHNG V.
V.1
TP HP ..................................................................................................................................... 147
1.
2.
3.
4.
V.2
V.2.1.
V.2.2.
V.2.3.
V.2.4.
V.2.5.
V.4.2.
V.4.3.
V.4.3.1.
V.4.3.2.
CHNG VI.
VI.1
VI.1.1.
VI.1.2.
VI.1.2.1.
VI.1.2.2.
VI.1.2.3.
VI.1.2.4.
VI.1.2.5.
VI.1.3.
VI.1.4.
Phm vi tnh......................................................................................................................178
Php ng = biu thc lambda + mi trng .........................................................179
Thay i b nh v php ng .....................................................................................180
Nhn bit hm..................................................................................................................181
Phm vi ng....................................................................................................................182
VI.2
VI.2.1.
VI.2.2.
203
204
1.
2.
Cc hm c tp............................................................................................................................193
Tp vn bn...................................................................................................................................195
VI.4.3.
1.
2.
Cc hm ghi ln tp ......................................................................................................................196
Lnh sao chp tp .........................................................................................................................197
VI.4.4.