Professional Documents
Culture Documents
Lập Trình Hàm
Lập Trình Hàm
LP TRNH HM
V Trung Hng Hung.Vo-Trung@ud.edu.vn
Ni dung
Nguyn l lp trnh hm Ngn ng Scheme Kiu d liu phc hp K thut x l hm Cu trc d liu
Phng php
L thuyt
Scheme, Richard Kelsey, Wiliam Clinger & Jonathan Rees Teach Yourself Scheme in Fixnum Days, Dorai Sitaram PLT DrScheme : Programming Env. Manual, http://www.drscheme.org/
Phn I
Nguyn l lp trnh hm
Khai bo d liu : tn bin - kiu Cc kiu d liu c bn : s, k t... Trng thi trong (b nh, thanh ghi) thay i bng lnh gn Trng thi ngoi (thit b ngoi vi) thay i bi cc lnh vo ra Cc cu trc iu khin D c hiu ng ph khi dng CT con
C s ca cc ngn ng hm (1)
Tnh khai bo
Ngn ng lp trnh hm
(print (process-data (get-data (...))))
C s ca cc ngn ng hm (2)
c im
L NNLT bc cao tru tng hn t s dng cc bin ton cc Ngi s dng quan tm n vic nh ngha cc hm ton hc d suy lun m khng quan tm n vn ci t Ngn ng lp trnh hm da trn vic tnh ton gi tr ca biu thc t bn ngoi li gi hm Mt hm c th c hoc khng c i s
C s ca cc ngn ng hm (3)
c im
Khng th thay i gi tr mt phn t ca mng Hn ch trong giao tip gia h thng tng tc vi HH v NSD
C s ca cc ngn ng hm (3)
Cc khi nim c bn trong LTH
Hm (function) Danh sch (list) Kiu (type) Tnh a kiu (polymorphism) Cc hm bc cao (higher-order function) Tham i ho tng phn (currying) Cc hm theo kiu khn ngoan (lazy-evalation) Phng trnh (equation)
Ngn ng Miranda
Gii thiu
Do David Turner pht trin nm 1986 Trnh thng dch chy trn Unix c im : thun tu hm
nh ngha hm
C php
<tn hm> ::<min xc nh> -><min gi tr> <tn hm>[<danh sch tham i>]=<biu thc> [<iu kin>]
Ngn ng Miranda
nh ngha hm
S dng :
celsius 68 --> 20
Ngn ng Miranda
nh ngha hm
S dng :
gcd 4 2 --> 2
Ngn ng Miranda
V d : tnh giai tha
fac :: num -> num fac n = 1, if n=0 fac x = x * fac(x - 1), otherwise
S dng :
fac 4 --> 24
Ngn ng Miranda
V d : tm nghim phng trnh bc 2
ptbac2 a b c = error "PT vo nghiem", if delta<0 = [-b/(2*a)], if delta=0 = [-b/(2*a)] + radix/(2*a), otherwise = [-b/(2*a)] - radix/(2*a), otherwise where delta=b*b-4*a*c and radix=sqrt delta
S dng :
ptbac2 2 1 -3 --> 1 -1.5
Ngn ng Miranda
Danh sch
Ngn ng Miranda
Danh sch
Ngn ng Miranda
Danh sch
Vit li mt s hm
length L = 0, if L = [] length L = 1 + length (tl L), otherwise concat L1 L2 = L2, if L1 = [] concat L1 L2 = L1, if L2 = [] concat L1 L2 = (hd L1) : concat (tl L1) L2, otherwise
Ngn ng Miranda
Php so khp
Mt hm c th nh ngha bng nhiu biu thc v phi khc nhau C php tng qut :
<pattern> = <expression>, <condition>
V d : tnh dy Fibonacci
fib 0 = 0 fib 1 = 1 fib (n+2) = fib (n+1) + fib n
Ngn ng Miranda
Php so khp
V d : tnh di chui
length [] = 0 length (a : L) = 1 + (length L) V d : tnh tng ca mng sum [] = 0 sum [a : X] = a + sum X
Ngn ng Miranda
Phng php currying (tham i ho tng
Cho hm n bin : f(x1, x2,..., xn) C th vit li : x1-->(x2-->...(xn-->f(x1..xn))...)) Mt hm nhiu hn 1 tham i th c th tham i ho tng phn
triple x = 3 * x hoc triple = multi 3
Ngn ng Miranda
Kiu v tnh a kiu (polymorphic)
Cc ngn ng hm thng khng s dng nh kiu Cho php nh ngha cc hm a kiu vi li gi c cc tham i c cc kiu d liu khc nhau V d
pair x y = [x, y]
S dng
pair 1 2 --> [1, 2] pair true false --> [true, false]
Ngn ng Miranda
Tnh hm theo kiu khn ngoan
Thng thng khi tnh gi tr mt hm, cc tham i c tnh gi tr trc --> tnh gi tr ca hm
mult (fac 3) (fac 4) --> mul 6 24 --> 144
V d
cond b x y = x, if b cond b x y = y, otherwise
Ngn ng Miranda
Tnh hm theo kiu khn ngoan
Ngn ng Miranda
Mt vi v d :
Ngn ng Miranda
Mt vi v d :
Sp xp nhanh
quicksort [] = [] quicksort (x:Tail) = quicksort [a a <-- Tail :a<x] quicksort [a a <-- Tail :a>x] Ex : Quicksort [5, 2, 9, 1] --> [1, 2, 5, 9]