Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 227 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
227
Dung lượng
1,88 MB
Nội dung
TS PHAN HUY KHNH Lp trỡnh hm NH XUT BN KHOA HC V K THUT Mc lc CHNG I NGUYấN Lí LP TRèNH HM 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 I.3 M u v ngụn ng lp trỡnh Vi nột v lch s nh ngha mt ngụn ng lp trỡnh Khỏi nim v chng trỡnh dch Phõn loi cỏc ngụn ng lp trỡnh Ngụn ng lp trỡnh mnh lnh C s ca cỏc ngụn ng hm Tớnh khai bỏo ca cỏc ngụn ng hm nh ngha hm 11 Danh sỏch 13 Phộp so khp 16 Phng phỏp currying (tham i hoỏ tng phn) 17 Khỏi nim v bc ca hm 18 Kiu v tớnh a kiu 20 Tớnh hm theo kiu khụn ngoan 22 Mt s vớ d 25 Loi b nhng phn t trựng 25 Sp xp nhanh quicksort 25 Bi toỏn tỏm quõn hu 26 Bi toỏn hamming 27 Kt lun 29 CHNG II NGễN NG SCHEME 33 II.1 II.2 II.2.1 II.2.1.1 II.2.1.2 II.2.1.3 II.2.2 II.2.3 II.3 II.3.1 II.3.2 II.3.2.1 II.3.2.2 II.3.2.3 II.3.2.4 Gii thiu Scheme 33 Cỏc kiu d liu ca Scheme 34 Cỏc kiu d liu n gin 34 Kiu s 34 Kiu lụgớch v v t 36 Ký hiu 38 Khỏi nim v cỏc biu thc tin t 39 S-biu thc 41 Cỏc nh ngha Scheme 41 nh ngha bin 41 nh ngha hm 42 Khỏi nim hm Scheme 42 Gi hm sau nh ngha 43 S dng cỏc hm b tr 44 Tớnh khụng nh kiu ca Scheme 45 i ii LP TRèNH HM II.3.3 II.3.3.1 II.3.3.2 II.3.3.3 II.3.4 II.3.4.1 II.3.4.2 II.3.4.3 II.3.4.4 II.3.4.5 II.3.5 Cu trỳc 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 Liờn kt bin theo dóy : dng let* 48 nh ngha cỏc v t 49 S quy v s lp 50 S quy 50 Vớ d 51 Tớnh tng bỡnh phng cỏc s t n n 51 Tớnh giai tha 51 Hm fibonacci 51 Tớnh cỏc h s nh thc 52 Tớnh dng ca li gi quy 52 Chng minh tớnh dng 54 S lp 54 Vo/ra d liu 56 c vo d liu : read 56 In d liu : write v display 56 Xõy dng vũng lp cú menu 57 CHNG III KIU D LIU PHC HP 61 III.1 Kiu chui 61 III.2 Kiu d liu vect 64 III.3 Kiu d liu b ụi 64 III.3.1 Khỏi nim tru tng hoỏ d liu 64 III.3.2 nh ngha b ụi 66 III.3.3 t bin trờn cỏc b ụi 68 III.3.4 ng dng b ụi 69 Biu din cỏc s hu t 69 Biu din hỡnh ch nht phng 72 III.4 Kiu d liu danh sỏch 74 III.4.1 Khỏi nim danh sỏch 74 III.4.2 ng dng danh sỏch 76 III.4.2.1 Cỏc phộp toỏn c bn cons, list, car v cdr 76 III.4.2.2 Cỏc hm x lý danh sỏch 79 Cỏc hm length, append v reverse 79 Cỏc hm tham chiu danh sỏch 80 Cỏc hm chuyn i kiu 81 Cỏc hm so sỏnh danh sỏch 83 III.4.2.3 Dng case x lý danh sỏch 84 III.4.2.4 K thut quy x lý danh sỏch phng 86 Tớnh tng cỏc phn t ca mt danh sỏch 86 Danh sỏch cỏc s nguyờn t n n 86 Nghch o mt danh sỏch 87 Hm append cú hai tham i 87 Loi b cỏc phn t danh sỏch 87 Bi toỏn tớnh tng 88 MC LC iii Lp danh sỏch cỏc s nguyờn t 88 III.4.2.5 K thut quy x lý danh sỏch bt k 89 Lm phng mt danh sỏch 89 Tớnh tng cỏc s cú mt danh sỏch 90 Loi b danh sỏch mt phn t cỏc mc khỏc 90 Nghch o danh sỏch 90 So sỏnh bng 91 III.4.3 Biu din danh sỏch 92 III.4.3.1 Biu din danh sỏch bi kiu b ụi 92 III.4.3.2 Danh sỏch kt hp 96 Khỏi nim danh sỏch kt hp 96 S dng danh sỏch kt hp 97 III.4.3.3 Dng quasiquote 98 III.4.4 Mt s vớ d ng dng danh sỏch 99 Tỡm phn t cui cựng ca danh sỏch 99 Lit kờ cỏc v trớ mt ký hiu cú danh sỏch 100 Tỡm tng ln nht mt vector 100 Bi toỏn sp xp dóy viờn bi ba mu 101 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 IV.2.6 IV.2.7 IV.3 IV.3.1 IV.3.2 IV.3.3 IV.3.4 IV.4 IV.4.1 IV.4.2 S dng hm 107 Dựng tờn hm lm tham i 107 p dng hm cho cỏc phn t ca danh sỏch 110 Kt qu tr v l hm 112 Phep tớnh lambda 113 Gii thiu phộp tớnh lambda 113 Biu din biu thc lambda Scheme 114 nh ngha hm nh lambda 115 K thut s dng phi hp lambda 117 nh ngha hm nh tớch lu kt qu 120 Tớnh tng giỏ tr ca mt hm ỏp dng cho cỏc phn t danh sỏch 120 Tớnh tớch giỏ tr ca mt hm ỏp dng cho cỏc phn t danh sỏch 120 nh ngha li hm append ghộp hai danh sỏch 120 nh ngha li hm map cho hm mt bin h 120 nh ngha cỏc hm fold 122 Tham i hoỏ tng phn 122 nh ngha quy cc b 123 X lý trờn cỏc hm 125 Xõy dng cỏc phộp lp 125 Hm append-map 125 Hm map-select 126 Cỏc hm every v some 126 Trao i thụng ip gia cỏc hm 127 T hp cỏc hm 129 Cỏc hm cú s lng tham i bt k 130 Mt s vớ d 132 Phng phỏp xp x liờn tip 132 To th tc nh dng 133 iv LP TRèNH 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 Nhõn a thc vi mt hng s 135 So sỏnh hai a thc 136 Phộp cng a thc 136 Phộp nhõn hai a thc 137 IV.4.3.4 Biu din mt a thc 137 IV.4.3.5 a a thc 138 IV.4.4 Thut toỏn quay lui 139 IV.4.4.1 Bi toỏn tỏm quõn hu 139 IV.4.4.2 Tỡm kim cỏc li gii 140 IV.4.4.3 T chc cỏc 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 Phộp hp trờn cỏc hp 148 Phộp giao trờn cỏc hp 149 Phộp hiu ca hai hp 149 Tỡm cỏc hp ca mt hp 150 Ngn xp 150 Kiu d liu tru tng ngn xp 150 Xõy dng ngn xp 151 Xõy dng trỡnh son tho bn 152 Ngn xp t bin 153 Tớnh biu thc s hc dng hu t 156 V.3 V.3.1 V.3.2 V.3.3 Tp 158 Cu trỳc d liu tru tng kiu 158 Vớ d ỏp dng 159 Tp t bin 160 V.4 V.4.1 V.4.1.1 V.4.1.2 V.4.1.3 V.4.1.4 V.4.2 V.4.2.1 V.4.2.2 V.4.2.3 Cõy 162 Cõy nh phõn 163 Kiu tru tng cõy nh phõn 163 Biu din cõy nh phõn 164 Biu din tit kim s dng hai phộp cons 164 Biu din dng y 165 Biu din n gin 165 Mt s vớ d lp trỡnh n gin 166 m s lng cỏc nỳt cú mt cõy 166 Tớnh cao ca mt cõy 166 Duyt cõy nh phõn 167 Cu trỳc cõy tng quỏt 169 Kiu tru tng cõy tng quỏt 169 Biu din cõy tng quỏt 169 Biu din cõy nh mt b ụi 169 Biu din cõy n gin qua cỏc lỏ 170 Mt s vớ d v cõy tng quỏt 170 MC LC V.4.2.4 V.4.3 V.4.3.1 V.4.3.2 v m s lng cỏc nỳt cõy 170 Tớnh cao ca cõy 171 Duyt cõy tng quỏt khụng cú x lý trung t 171 ng dng cõy tng quỏt 172 Xõy dng cõy cỳ phỏp 172 Vớ d : o hm hỡnh thc 173 CHNG VI MễI TRNG V CP PHT B NH 177 VI.1 Mụi trng 177 VI.1.1 Mt s khỏi nim 177 VI.1.2 Phm vi ca mt liờn kt 178 VI.1.2.1 Phm vi tnh 178 VI.1.2.2 Phộp úng = biu thc lambda + mụi trng 179 VI.1.2.3 Thay i b nh v phộp úng 180 VI.1.2.4 Nhn bit hm 181 VI.1.2.5 Phm vi ng 182 VI.1.3 Thi gian sng ca mt liờn kt 184 VI.1.4 Mụi trng ton cc 184 VI.2 Cp phỏt b nh 185 VI.2.1 Vớ d : mụ phng mỏy tớnh b tỳi 186 VI.2.2 Vớ d : bi toỏn cõn i ti khon 187 VI.3 Mụ hỡnh s dng mụi trng 189 VI.4 Vo/ra d liu 192 VI.4.1 Lm vic vi cỏc 192 VI.4.2 c d liu trờn 193 Cỏc hm c 193 Tp bn 195 VI.4.3 Ghi lờn 196 Cỏc hm ghi lờn 196 Lnh chộp 197 VI.4.4 Giao tip vi h thng 198 PH LC 203 TI LIU THAM KHO 205 LI NểI U C un sỏch ny trỡnh by c s lý thuyt v nhng k thut lp trỡnh c bn theo phong cỏch ôlp trỡnh hmằ (Functional Programming) õy l kt qu biờn son t cỏc giỏo trỡnh sau nhiu nm ging dy bc i hc v sau i hc ngnh cụng ngh thụng tin ca tỏc gi ti i hc Nng Cun sỏch gm sỏu chng cú ni dung nh sau : Chng gii thiu quỏ trỡnh phỏt trin v phõn loi cỏc ngụn ng lp trỡnh, nhng c im c bn ca phong cỏch lp trỡnh mnh lnh Phn chớnh ca chng trỡnh by nhngnguyờn lý lp trỡnh hm s dng ngụn ng minh ho Miranda Chng trỡnh by nhng kin thc m u v ngụn ng Scheme : cỏc khỏi nim v cỏc kiu d liu c s, cỏch nh ngha hm, biu thc, k thut s dng quy v phộp lp Chng trỡnh by cỏc kiu d liu phc hp ca Scheme nh chui, vect, danh sỏch v cỏch dng cỏc kiu d liu tru tng nh ngha hm Chng trỡnh by nhng kin thc nõng cao v k thut lp trỡnh hm, nh ngha hm nh phộp tớnh lambda, ng dng thut toỏn quay lui, truyn thụng ip Chng trỡnh by chi tit hn k thut lp trỡnh nõng cao vi Scheme s dng cỏc cu trỳc d liu : hp, ngn xp, hng i, cõy v Chng trỡnh by khỏi nim mụi trng, cỏch t chc v cp phỏt b nh, cỏch vo/ra d liu ca Scheme vi th gii bờn ngoi Phn ph lc gii thiu tt ngụn ng lp trỡnh WinScheme48, hng dn cỏch ci t v s dng phn mm ny Cun sỏch ny lm ti liu t kho cho sinh viờn cỏc ngnh cụng ngh thụng tin v nhng bn c mun tỡm hiu thờm v k thut lp trỡnh cho lnh vc trớ tu nhõn to, giao tip h thng, x lý ký hiu, tớnh toỏn hỡnh thc, cỏc h thng ho Trong sut quỏ trỡnh biờn son, tỏc gi ó nhn c t cỏc bn ng nghip nhiu úng gúp b ớch v mt chuyờn mụn, nhng ng viờn khớch l v mt tinh thn, s giỳp tn tỡnh v biờn cun sỏch c i Do mi xut bn ln u tiờn, ti liu tham kho ch yu l ting nc ngoi, chc chn rng ni dung ca cun sỏch cũn bc l nhiu thiu sút, nht l cỏc thut ng dch ting Vit Tỏc gi xin c by t õy lũng bit n sõu sc v mi ý kin phờ bỡnh úng gúp ca bn c gn xa Nng, ngy 06/09/2004 Tỏc gi PHAN HUY KHNH L P T R èN H HM Functional Programming L p trỡnh hm l phong cỏch lp trỡnh da trờn nh ngha hm s dng phộp tớnh lambda (-calculus) Lp trỡnh hm khụng s dng cỏc lnh gỏn bin v khụng gõy hiu ng ph nh gp lp trỡnh mnh lnh Trong cỏc ngụn ng lp trỡnh hm, hm (th tc, chng trỡnh con) úng vai trũ trung tõm, thay vỡ thc hin lnh, mỏy tớnh tớnh biu thc ó cú rt nhiu ngụn ng hm c phỏt trin v ng dng nh Miranda, Haskell, ML, cỏc ngụn ng h Lisp : Scheme, Common Lisp Phn u cun sỏch ny trỡnh by c s lý thuyt v nhng khỏi nim c bn ca lp trỡnh hm s dng ngụn ng minh ho l Miranda, mt ngụn ng thun tuý hm D Turner xut 1986 Phn chớnh trỡnh by k thut lp trỡnh hm Scheme, mt ngụn ng Guy Lewis Steele Jr v G Jay Sussman xut 1975 Ngụn ng Scheme cú tớnh s phm cao, gii quyt thớch hp cỏc bi toỏn toỏn hc v x lý ký hiu Scheme cú cỳ phỏp n gin, d hc, d lp trỡnh Mt chng trỡnh Scheme l mt dóy cỏc nh ngha hm gúp li nh ngha mt hoc nhiu hm phc hn Scheme lm vic theo ch thụng dch, tng tỏc vi ngi s dng Cun sỏch ny rt thớch hp cho sinh viờn cỏc ngnh cụng ngh thụng tin v nhng bn c mun tỡm hiu v k thut lp trỡnh ng dng lnh vc trớ tu nhõn to, giao tip ngi-h thng, x lý ký hiu, tớnh toỏn hỡnh thc, thit k cỏc h thng ho V TC GI : Tt nghip ngnh Toỏn Mỏy tớnh nm 1979 ti trng i hc Bỏch khoa H Ni T 1979 n ging dy ti khoa Cụng ngh Thụng tin, trng i hc Bỏch khoa, i hc Nng Bo v tin s nm 1991 ti Phỏp Gi chc ch nhim khoa Cụng ngh Thụng tin 1995-2000 Hng nghiờn cu chớnh : x lý ngụn ng, x lý a ng, lý thuyt tớnh toỏn E-mail: phanhuykhanh@dng.vnn.vn 190 LP TRèNH HM Khi Scheme tỡm kim m t giỏ tr tng ng vi mt tờn, Scheme s xem xột trc tiờn khung tng ng v i cỏc nh ngha c c b, r i sau ú, nu cn thit, Scheme s xem xột khung tng ng vi cỏc nh ngha ton cc, v.v Nh vy, mt nh ngha s ct du ti ch mt nh ngha ton cc (define x 1) (define (f x) x) (f 2) > x > (define (g L) (define car cdr) (car L)) (g (1 5)) > (2 5) Ta ó thay i, m t cỏch cc b, hm tin nh car bi cdr bờn nh ngha hm g, iu ny khụng nh hng n car ngoi hm g : (car (1 3)) > Tuy nhiờn ta khụng nờn thay i cỏc hm tin nh mụi trng ton cc (mc nh), i lo i nh : (define car cdr) Lỳc ny, hot ng c a car khụng cũn ỳng na : (car (1 3)) > (2 3) > (cdr (1 3)) > (2 3) Mụi trng ton cc c rỳt g n v mt khung cha cỏc bin tin nh ngha (cons, car, cdr, ) v cỏc bin ca ng i s d ng Scheme tớnh giỏ tr mt biu thc mụi trng ton cc ny Mt hm c biu din b i mt cp [I ; E], ú I l danh sỏch cỏc lnh ca hm, cũn E l mụi trng ú hm c tớnh Khi b d ch Scheme gi m t hm mt mụi trng, nú to mt khung mi C cha cỏc cp : (tham i hỡnh thc, tham i thc s) Tip theo, b d ch thc hin hm mụi trng (C, C1, C2, , Cn), ú, danh sỏch cỏc khung (C1, C2, , Cn) l mụi trng x lý ca hm Mụi trng ny cú th khụng liờn quan gỡ n mụi trng gi c a nú Khi hm to cỏc bin (nh cỏc lnh define) bt u c thc hin, b dch Scheme thờm cỏc cp bin = giỏ tr tng ng vo khung C Vớ d : (define x 1) MễI TRNG V CP PHT B NH 191 (define (f y) (define x 2) (+ x y)) Ngoi cỏc bin ó nh ngha trc ú, lỳc ny khung C ca mụi trng ton cc cha cỏc cp : x = 1, f = P, ú P = [I ; E] , I = (lambda (y) (define x 2) (+ x y)), v E = (C) Li g i (f 5) s gõy : To khung C = { y = 5} Thc hin cỏc lnh I (C, C) Sau (define x 2), thỡ C = { x = 2, y = 5} Thc hin (+ x y), kt qu l õy, x v y c nh ngha khung C, hm + c nh ngha C Do vy li gi (f 5) cho kt qu : (f 5) > Bõy gi ta xột li bi toỏn cõn i ti khon ngõn hng (vớ d mc trc) Li gi : (define account (create-account 1000)) s gõy : Hm create-account c g i mụi trng (C, C) C = {S = 1000}, C l khung ton c c Sau thc hin (define (switch m) ), thỡ C = { switch = P, S = 1000 }, vi P = [ cỏc lnh ca switch ; (C, C) ] Hm create-account tr v giỏ tr ca switch, l P Bin account cú giỏ tr l hm : P = [ cỏc lnh ca switch ; (C, C) ] Khi cú li g i : (balance account) cng cú ngha l : (account balance) b d ch Scheme thc hin cỏc lnh c a switch mụi trng : ({m = solde}, C, C) Giỏ tr ca S l C, tc l 1000 V gi : ((withdrawal! account) 100) cng cú ngha l th c hin li g i : (account withdrawal!) 192 LP TRèNH HM b d ch Scheme thc hin hm to ti khon b i (withdrawal! account), r i gi hm tham s l 100 : Cỏc lnh ca switch c tớnh mụi trng : E = ({ m = withdrawal!}, C, C) Thụng ip withdrawal! gõy vic tớnh mt hm mi [I ; E], ú I = (lambla (n) (if ) (set! S (- S n))) Li g i ca hm ny thc hin cỏc lnh trờn mụi trng : (C, { m = withdrawal! }, C, C), ú C = { n =100 } (set! S (- S n)) thay i giỏ tr c a S khung cha S, l C Khung C ó b thay i : C = { switch = P, S = 900 } s d ng cỏc x lý cõn i ti khon sau ny, l add! v withdrawal! hm account, S cú giỏ tr 900 VI.4 Vo/ra d liu Cỏc th tc vo/ra c a Scheme cho phộp c d liu vo t cng vo (input port) v a d liu c ng (output port) C ng cú th l bn phớm, mn hỡnh, hay (file) Trong chng trc, chỳng ta ó c lm quen vi cỏc hm read ( c d liu vo t bn phớm), write v display (a d liu mn hỡnh) Cỏc hm ny xem bn phớm, mn hỡnh l cỏc cng vo/ra mc nh (console) Cng vo cú giỏ tr current-input-port v c ng cú giỏ tr current-output-port Cỏc c ng vo/ra mc nh ny cú th t lm tham i port hm vo/ra Chng hn : (define e (read)) (write e) hay cú tham i port : (define (read (current-input-port))) (write e (current-output-port)) l hiu qu nh VI.4.1 Lm vic vi cỏc Tp l phng tin lu tr mt dóy cỏc d liu bt k trờn mt thit b nh ngoi nh a mm, a cng, CD-ROM, bng t, v.v Tp c t tờn theo quy c ca h iu hnh d dng truy cp n h thng th mc t chc kiu phõn cp lm vic (c/ghi) vi tp, cn thit lp s liờn kt gia vi mt h thng Scheme S liờn kt ny to mt lu ng hay dũng d liu (data flow) gia v cỏc hm vo/ra c a Scheme Khi c (read) m t tp, cn liờn kt ny v i dũng vo (input flow) c a Scheme cung cp cỏc hm c Khi ghi lờn (write) mt tp, cn liờn kt ny vi dũng (output flow) c a Scheme cung cp cỏc hm a (ghi) Scheme cú cỏc hm liờn kt m t dũng d liu vi m t nh sau : MễI TRNG V CP PHT B NH 193 (open-input-file filename) > liờn kt dũng vo vi filename ó cú mt trờn thit b nh (open-output-file filename) > liờn kt dũng vi filename cn to Sau s d ng m t dũng d liu, cn phi úng li bi : (close-input-port flow) > úng dũng vo flow (close-output-port flow) > úng dũng flow liờn kt m t vi mt dũng, cn s d ng cỏc hm sau õy : (call-with-input-file filename fct) (call-with-output-file filename fct) Cỏc hm ny s úng t ng cỏc dũng sau s d ng xong Tham bin fct phi l mt hm cú m t tham bin cho tham bin ny c liờn kt v i dũng thc hin thõn hm v dũng s t úng li sau thc hin xong i vi trng hp call-with-input-file, truy cp n ó cú mt trờn thit b nh, cũn i vi trng hp call-with-output-file, li gi ny khụng cú tỏc dng nu ó t n ti Dũng d liu l mt i tng Scheme ú nú cú th c kim tra bi v t : (input-port ? s) > #t nu s l mt dũng vo (output-port ? s) > #t nu s l mt dũng Nh ó núi trờn, dũng vo hin hnh cho bi hm (current-input-port), dũng hin hnh cho b i hm (current-output-port) VI.4.2 c d liu trờn Cỏc hm c Cỏc hm c ca Scheme cú mt tham i tu ch n (optional) l mt dũng Hm : (read [flow]) c s-biu thc u tiờn ti v trớ u c ca liờn kt vi dũng flow v di u c n v trớ b t u ca s-biu thc tip theo, sau ký t cu i cựng ca s-biu thc ó c Khi u c i n cu i tp, mt i tng ỏnh du kt thỳc (end of file) c nhn bit b i v t : (eof-object ? s) Gi s ti th m c hin hnh ang lu gi mailto.txt cú n i dung : University of Danang 41, Le Duan St., Danang City, Vietnam Tel: (84.511) 822041, 832678 Fax: (84.511) 823683 194 LP TRèNH HM S dng read c mt s-biu thc nh liờn kt dũng vo vi nh sau : (define flow (open-input-file mailto.txt)) flow > #{Input-port #{Input-channel mailto.txt}} (define s1 (read flow)) s1 > university (define s2 (read flow)) s2 > of Ho c s d ng kt vi dũng vo : (call-with-input-file mailto.txt (lambda (flow) (let ((s (read flow))) s))) > university Chỳ ý tham bin th hai ca call-with-input-file l m t hm mt bin, õy l nh ngha hm b i lambda theo bin flow Hm read thc t l mt b phõn tớch cỳ phỏp (syntax analyser) cho cỏc s-biu thc, b ng cỏch chuyn cỏch biu din bờn ngoi c a s-biu thc cú mt trờn thnh biu din bờn sau ú c x lý b i Scheme Tip theo õy l mt vớ d minh ho quỏ trỡnh c Ta xõy d ng v t kim tra mt sbiu thc s ó cho (trong trng hp ny l ton b mt nh ngha hm hp thc) cú mt mt f g m cỏc s-biu thc hay khụng (sf?) V t l s d ng mt vũng lp nh letrec c tng s-biu thc v so sỏnh v i s cho n tho hoc gp ký hiu kt thỳc (define (expr-present? s f) ; f l tờn hm s c (letrec ((loop ; xõy dng vũng lp cho n gp ký hiu kt thỳc (lambda (flow) (let ((expr-read (read flow))) (cond ((eof-object? expr-read) #f) ; kim tra b ng hai s-biu thc ((equal? expr-read s) #t) (else (loop flow))))))) ; liờn kt f vi dũng d liu vo (call-with-input-file f loop))) Vic gi v t c thc hin nh sau : (expr-present? Danang mailto.txt) > #t Scheme cũn cú cỏc hm c tng ký t trờn dũng vo Hm : (read-char [flow]) c vo m t ký t v di chuyn u c sang ký t tip theo (ngi c cú th tỡm hiu sõu hn ti liu ôRevised(5) Report on the Algorithmic Language Schemeằ) Hm : (peek-char [flow]) c vo mt ký t nhng khụng di chuyn u c sang ký t tip theo MễI TRNG V CP PHT B NH 195 Scheme khụng cho phộp s dng read c mt d liu bt k (kiu Pascal), m phi c tng ký t mt bi read-char Chng hn : (define flow (open-input-file mailto.txt)) (read-char flow) > #\U Li gi sau õy c ký t u c a mailto.txt : (call-with-input-file mailto.txt (lambda (flow) (let* ((c1 (read-char flow)) (c2 (read-char flow)) (c3 (read-char flow)) (c4 (read-char flow))) (list c1 c2 c3 c4)))) > (#\U #\n #\i #\v Sau õy ta xõy d ng hm readfile thc hin c v chộp ni dung mt lờn mn hỡnh Hot ng c a readfile tng t v t expr-present? va nh ngha trờn õy : s dng mt vũng lp nh letrec c ln lt cỏc ký t bi read-char r i a mn hỡnh cho n gp ký hiu kt thỳc eof : (define (read-file f) (letrec ((loop (lambda(flow) (let ((char (read-char flow))) (if (not (eof-object? char)) (begin (display char) (loop flow))))))) (call-with-input-file f loop))) (read-file mailto.txt) > University of Danang 41, Le Duan St., Danang City, Vietnam Tel: (84.511) 822041, 832678 Fax: (84.511) 823683 Tp bn Mt s cú cu trỳc l mt chui liờn tip cỏc kh i (block) Chng hn bn l mt chui cỏc dũng (line), m i dũng l mt c kt thỳc bi du qua dũng Trong Scheme du qua dũng l ký t quy c #\newline ỏnh du v trớ cu i ca m t khi, ngi ta thng s d ng mt hoc nhiu ký t phõn cỏch (separator mark) Vic c c thc hin ln lt cho cỏc c a Di õy l hm read-block c tt c cỏc kh i m t dũng tr v kt qu l mt chu i ký t Hm s d ng hai tham i, mt tham i l dũng vo liờn kt vi b n v m t tham i l v t separator? cho phộp x lý c cỏc ký t phõn cỏch khỏc Hm bờn l m t vũng lp tớch l y cỏc ký t ca v a c vo mt danh sỏch sau ú chuyn i danh sỏch thnh chu i trc t vo cu i chu i kt qu Trc c mt khi, cn g i hm read-separator xoỏ ht cỏc ký t phõn cỏch : (define (read-block flow separator?) (letrec 196 LP TRèNH 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 ()))) Nu mun c tng dũng b n, ta s dng v t sộparator? c nh ngha nh sau : (define (separator?) (lambda(char) (eq? #\newline char)) Tuy nhiờn ta c ng cú th c theo tng t (word) Thụng th ng cỏc t t cỏch bi cỏc ký t : khong trng hay d u cỏch (space), ký t thoỏt (escape), nh y c t (tabulation), du qua dũng, d u kt thỳc trang Trong Scheme, cỏc ký t ny c nhn bit b i v t char-whitespace? Nu s dng cỏc d u chm cõu mt bn thỡ ch cn b sung thờm cỏc ký t phõn cỏch (char-whitespace? #\space) > #t VI.4.3 Ghi lờn Cỏc hm ghi lờn Cỏc hm ghi lờn c liờn kt vi m t dũng : (write s [flow]) (display s [flow]) (newline [flow]) (write-char char [flow]) Sau thc hin ghi lờn tp, cỏc hm trờn tr v m t giỏ tr khụng xỏc nh v khụng a gỡ lờn mn hỡnh Trong Scheme, vic ghi lờn t p bi display lm ngi c d c kt qu, nhng ghi lờn b i display thỡ Scheme li d c (d x lý) hn Ta hóy so sỏnh cỏc li gi sau : (write #\n) > #\n (display #\n) > n (write tom and jerry) > tom and jerry (display tom and jerry) > tom and jerry Nh vy write gi nguyờn tt c cỏc ký t c bit ca chui ghi lờn Scheme cũn cú hm ghi lờn tng ký t dũng Gi s ta cn to th mc hin hnh mailto.txt cú n i dung sau : (define flow (open-output-file mailto.txt)) (display University of Danang flow) MễI TRNG V CP PHT B NH 197 (newline flow) ; ghi ký t qua dũng (display 41, Le Duan St., Danang City, Vietnam flow) (newline flow) ; ghi ký t qua dũng (display Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683 flow) (close-output-port flow) G i hm readfile xem li ni dung : (readfile mailto.txt) University of Danang 41, Le Duan St., Danang City, Vietnam Tel: (84.511) 822041, 832678 - Fax: (84.511) 823683 Khi to tp, ghi ký t qua dũng, ta cng cú th s d ng hm write-char : (write-char #\newline flow) Lnh chộp Sao chộp (copy) thng xuyờn c s d ng lm vic vi Ta xõy d ng hm copy-file tng t cỏc hm c read-file Hm chộp s x lý ln lt tng ký t t u n cu i tp, cho n gp ký hiu eof Trong hm, ta dựng m t vũng lp dng duyt (define (copy-file source target) (call-with-input-file source (lambda (input-flow) (call-with-output-file target (lambda (output-flow) (do ((char (read-char input-flow) (read-char input-flow))) ((eof-object? char)) (write-char char output-flow))))))) (copy-file "mailto.txt" "uodn.txt") #t Khi cn lm vic vi cỏc cha cỏc hm Scheme, ta cú th thay th vic c tng ký t bi c nguyờn m t s-biu thc Tuy nhiờn, theo cỏch ny, cỏc dũng chỳ thớch s khụng c chộp M t cỏch tng quỏt, nu ta cú m t c t chc theo cu trỳc dng kh i, ta cú th chộp tng bng cỏch s d ng chc nng c hoc ghi trờn Sau õy l mt chng trỡnh thc hin chộp trờn theo : (define (copy-flow flow-in flow-out rd-block wr-block) (letrec ((loop (lambda() (let ((block (rd-bloc flow-in))) (if (eof-object? block) undefine (wr-bloc bloc flow-out)))))) (loop))) 198 LP TRèNH HM VI.4.4 Giao tip vi h thng Quỏ trỡnh giao tip gia NSD v i h thng ph thu c cỏch ci t cỏc trỡnh thụng d ch ca Scheme Tuy nhiờn, Scheme chun cú hm load cho phộp ti mt cha cỏc chng trỡnh Scheme vo b nh sn sng g i ch y Cỳ phỏp ca hm load nh sau : (load filename) Vớ d : Gi s ti th m c hin hnh cú cha chng trỡnh li gii bi toỏn ôThỏp H Niằ, NSD np vo b nh v gi chy nh sau : (load hanoi.scm) > hanoi.scm (hanoi #\A #\B #\C) Move one disk from Move one disk from Move one disk from Move one disk from Move one disk from Move one disk from Move one disk from A A B A C C A to to to to to to to B C C B A B B Chỳ ý rng giỏ tr tr v c a load khụng nh hng n giỏ tr tr v c a currentinput-port v current-output-port Bi chng Cho bit giỏ tr tr v t : ((lambda (a) (let ((a 1)) ((f (lambda (x) (+ a x)))) (f a))) 5) > ? V cỏc liờn kt cho chu lm vic sau õy (let*((x 2) (y (+ x x)) (z (* x y))) (let ((x y) (y x) (+ *)) (+ x y z))) Ch liờn kt hin hnh ca cỏc bin (+ x y z) ? Ti khụng th dựng car thay vỡ head nu nh ngha li car phn trỡnh by lý thuyt ? Gii thớch vỡ ngi ta khụng th s dng nh ngha õy : (define car (lambda (L) (if (null? L) () (car L)))) MễI TRNG V CP PHT B NH 199 Vit hm : a) Tớnh s lng cỏc ký t m t ? b) Tớnh s lng cỏc ký t khụng phi l ký t phõn cỏch (khụng phi l cỏc du cỏch, nh y ct, hay qua dũng) ? Vit hm so sỏnh hai b n tr v dũng b n u tiờn khỏc gia hai ? T bn s nguyờn dng A, B, C, D cho 1A31, 1B12, 1000C2000, 1D7 (ý ngha c a b n s ny l ngy A thỏng B n m C l ngy th D, ú D=1 l ngy Ch nht, D=2 l ngy th Hai, D=7 l ngy th By) v ba s nguyờn dng A1, B1, C1 thoó cỏc iu kin tng ng i vi A, B, C, hóy cho bit ngy A1 thỏng B1 nm C1 l ngy th m y ? Chỳ ý n cỏc nm nhun Cho s nguyờn d ng n v bin thc x thay i t n vi b c tng l h = 0.01 Hóy tớnh tớch phõn : I = sin n x dx Vi cỏc giỏ tr c a n c tớnh theo cụng thc : n 1 n I= n n vi n chn, n vi n l, n T danh sỏch s nguyờn a0, a1, a2 , a3, a4, hóy tr v m i nghim nguyờn cú th c a phng trỡnh a thc bc h s nguyờn : a0 + a1x + a2 x2 + a3 x3 + a4 x4 = Cho s thc x thay i t n vi b c tng l h = 0.01 v n nguyờn dng, b ng cỏch s d ng c hai phng phỏp quy v lp, tớnh giỏ tr ca a thc Tsebsep bc n c cho bi cụng thc truy h i nh sau : Tn(x) = 2xTn1(x) Tn2(x) vi n = 2, 3, 4, Trong ú : T0(x) = 1, T1(x) = x Un+2(x) = xUn+1(x) - 0.25 Un(x) vi n = 0, 1, 2, Trong ú : U0(x) = 1, U1(x) = x 10 Cho s thc x thay i t n vi b c tng l h = 0.01 v n nguyờn dng, b ng cỏch s d ng c hai phng phỏp quy v lp, tớnh giỏ tr ca a thc Legendre bc n c cho bi cụng thc truy h i nh sau : Ln+2(x) = xLn+1(x) - (n + 1)2 Ln (x) (2n + 1)(2n + 3) vi n = 0, 1, 2, Trong ú : L0(x) = 1, L1(x) = x 11 Cho s thc x thay i t n vi bc tng l h = 0.01 Tớnh t ng : x2 x3 xn S = - x + + + (-1) n + 2! 3! n! vi chớnh xỏc cho trc, chng hn = 10-5 200 LP TRèNH HM 12 Cho s thc x thay i t n vi bc tng l h = 0.01 v n nguyờn dng Tớnh giỏ tr : y= x + x + + x cú n > du cn 13 Cho s thc x thay i t n vi b`c tng l h = 0.01 v n nguyờn dng Tỡm nghim phng trỡnh vi phõn : f(x) = cos x x , bit rng nghim gia cỏc im ca hm cos x, ngha l , 2 f(x n ) Dựng phng phỏp lp Newton : x n + = x n , vi f (x) l o hm c a f f '(x n ) 14 Dóy Fibonaci c nh ngha nh sau : f0 = f1 = fn = fn-1 + fn-2 vi n Vit v t kim tra mt s nguyờn m cho trc cú phi l s Fibonaci khụng ? 15 Cho s n nguyờn dng, hóy tỡm giỏ tr an c xỏc nh t dóy s nguyờn a1, a2, , an nh sau : a1 = a2 = an = an-1 + * (n1) 16 Cho s thc x thay i t n vi bc tng l h = 0.01 Tớnh t ng : 1+ x2 x4 x6 + ì + ì ì + vi chớnh xỏc cho trc, chng hn = 10-5 17 Tỡm tt c cỏc s cú ch s cho tng lp phng ca cỏc ch s bng chớnh s ú Chng hn g i a, b, c l ch s ca s cn tỡm, ú iu kin trờn c mụ t : 100ìa + 10ìb + c = aìaìa + bìbìb + cìcìc Vớ d 153 = 13 + 53 + 33 18 Nhp vo mt s nguyờn ngu nhiờn bt k in theo m i hoỏn v ca cỏc ch s cú th s ú Vớ d nhp vo 195 thỡ in 159, 915, 951, 519, 591 19 Cho trc mt thỏng bt k nm, hóy cho biờt thỏng ny thuc quớ no ? Thỏng ny cú bao nhiờu ngy ? Cho trc m t ngy bt k nm dd/mm/yyyy, hóy cho biờt s ngy k t ngy u nm 01/01/yyyy (chỳ ý nm nhun) ? 20 Cho s thc x thay i t n vi bc tng l h = 0.01 Tớnh t ng : x3 x5 x7 ì + ì ì + ì ì ì + vi chớnh xỏc cho trc, chng hn = 10-5 x+ MễI TRNG V CP PHT B NH 201 21 Viờt chng trỡnh tớnh s vi chớnh xỏc 10-4 bit rng : 1 1 = + + cho n < 10 4 2n 22 Cho x thc Tinh tng : S = 1+ x2 x4 x6 x 2n + + + + + 2! 4! 6! (2n)! cho ờn x 2n < 105 (2n)! 23 Cho s thc x thay i t n vi bc tng l h = 0.01 Hóy tớnh : f (x) = e-x sin (2px) g (x) = e-2xsin (2px ) + cos (2px) 24 Cho s thc x thay i t n vi bc tng l h = 0.01 Xõy dng hm log(a, x) tớnh logarit c s a ca x Dựng hm ny tớnh giỏ tr ca biu thc sau : log x (1 + x ) x < y = x = log (x 1) x > 25 Dóy s nguyờn a0, a1, a2 an, xỏc nh bng quy np nh sau : a0 = an = n an-1 nu n chn an = n + an-1 nu n l (n = 2, 4, ) (n = 1, 3, ) Cho trc n, hóy tỡm giỏ tr an 26 Tỡm nghim c a h phng trỡnh : ax + by + c = px + qy + r = Chỳ ý tr v : ôkhụng xỏc nhằ v ôph thuc tuyn tớnhằ nu aq - bp = nu a b c = = p q r Cỏc h s c cho dng danh sỏch (a b c p q r) 27 Cho cỏc danh sỏch phng, s l cỏc vect n chiu X, Y v Z : X = (x1, x2, , xn) Y = (y1, y2, , yn) Tớnh tớch vụ hng ca hai vect X v Z, vi vect Z cú cỏc thnh phn zi, i = n, c xỏc nh nh sau : zi = nu < xi + yi< A, A > xi + yi nu xi + yi A (xi + yi)2 nu xi + yi 28 Tớnh a thc Hermit Hn(x) theo cỏc phng phỏp s quy v s lp : H0(x) = 202 LP TRèNH HM H1(x) = 2x Hn(x) = 2xHn-1(x) - 2(n-1)Hn-2(x) 29 Cho s thc x thay i t n vi bc tng l h = 0.01 v n nguyờn dng, bng cỏch s dng c hai phng phỏp quy v lp, tớnh giỏ tr c a a thc Laguerre bc n (a = 0) c cho bi cụng thc truy hi nh sau : Ln+2(x) = (x 2n 3)Ln+1(x) - (n + 1)2 Ln(x) vi n = 0, 1, 2, ú : L0(x) = 1, L1(x) = x 30 Cỏc nghim c a phng trỡnh bc ba quy v dng chớnh tc : x3 + px + q = c tớnh theo cụng thc : = Arc cos( q p3 27 A=2 ) p x1 = Acos x = Acos + x = Acos c vo n nguyờn dng v cỏc cp giỏ tr pi, qi, i = n a cỏc giỏ tr nghim tng ng x1 , x2 v x3 i i i 31 Cho N l mt s d ng, tớnh cn b c hai N theo phng phỏp Newton (khụng s d ng hm sqrt) Ni dung phng phỏp : Nu gi s l giỏ tr gn ỳng c a cn b c hai c a n N thỡ 0.5* + s l giỏ tr gn ỳng hn ca N Quỏ trỡnh tớnh toỏn dng li t ti s N chớnh xỏc cn thit Gi s ch n = 10 6, ú : < s MC LC CHNG V V.1 CU TRC D LIU 147 TP HP 147 Phộp hp trờn cỏc hp 149 Phộp giao trờn cỏc hp 149 Phộp hiu ca hai hp 150 Tỡm cỏc hp ca mt hp 150 V.2 NGN XP 150 Kiu d liu tru tng ngn xp 151 Xõy dng ngn xp 152 Xõy dng trỡnh son tho bn 153 Ngn xp t bin 154 Tớnh biu thc s hc dng hu t 156 V.3 TP 158 V.3.1 Cu trỳc d liu tru tng kiu 158 V.3.2 Vớ d ỏp dng 159 V.3.3 Tp t bin 160 V.4 CAY 162 V.4.1 Cõy nh phõn 162 V.2.1 V.2.2 V.2.3 V.2.4 V.2.5 V.4.1.1 Kiu tru tng cõy nh phõn 162 V.4.1.2 Biu din cõy nh phõn 164 Biu din tit kim s dng hai phộp cons 164 Biu din dng y 165 Biu din n gin .165 V.4.1.3 Mt s vớ d lp trỡnh n gin 166 m s lng cỏc nỳt cú mt cõy 166 Tớnh cao ca mt cõy .166 V.4.1.4 Duyt cõy nh phõn 167 V.4.2 Cu trỳc cõy tng quỏt 169 V.4.2.1 Kiu tru tng cõy tng quỏt 169 V.4.2.2 Biu din cõy tng quỏt 169 Biu din cõy nh mt b ụi .169 Biu din cõy n gin qua cỏc lỏ 170 V.4.2.3 Mt s vớ d v cõy tng quỏt 170 m s lng cỏc nỳt cõy 170 Tớnh cao ca cõy 171 V.4.2.4 Duyt cõy tng quỏt khụng cú x lý trung t .171 V.4.3 ng dng cõy tng quỏt 172 V.4.3.1 V.4.3.2 Xõy dng cõy cỳ phỏp 172 Vớ d : o hm hỡnh thc 173 CHNG VI VI.1 MễI TRNG V CP PHT B NH 177 MOI TRNG 177 Mt s khỏi nim 177 Phm vi ca mt liờn kt 178 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 Phộp úng = biu thc lambda + mụi trng 179 Thay i b nh v phộp úng .180 Nhn bit hm 181 Phm vi ng 182 Thi gian sng ca mt liờn kt 184 Mụi trng ton cc 184 VI.2 CP PHAT B NH 185 Vớ d : mụ phng mỏy tớnh b tỳi 186 Vớ d : bi toỏn cõn i ti khon 187 VI.3 Mễ HèNH S DNG MễI TRNG 189 VI.4 VO/RA D LIU 192 VI.4.1 Lm vic vi cỏc 192 VI.2.1 VI.2.2 TS Phan Huy Khaùnh bión soaỷn 12/1999 203 204 Error! Reference source not found VI.4.2 c d liu trờn 193 Cỏc hm c 193 Tp bn 195 VI.4.3 Ghi lờn 196 Cỏc hm ghi lờn 196 Lnh chộp 197 VI.4.4 Giao tip vi h thng 198