1 / 25

Bevezetés a funkcionális programozásba

Bevezetés a funkcionális programozásba. csink.laszlo@nik.bmf.hu 2009. DrScheme. A funkcionális programozást egy DrScheme nevű kevert – azaz imperatív és funkcionális elemeket is tartalmazó – nyelven keresztül mutatjuk be. Szabadon letölthető: http://www.plt-scheme.org/software/drscheme/

binah
Download Presentation

Bevezetés a funkcionális programozásba

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bevezetés a funkcionális programozásba csink.laszlo@nik.bmf.hu 2009

  2. DrScheme A funkcionális programozást egy DrScheme nevű kevert – azaz imperatív és funkcionális elemeket is tartalmazó – nyelven keresztül mutatjuk be. Szabadon letölthető: http://www.plt-scheme.org/software/drscheme/ A következőkben a funkcionális mag bemutatására koncentrálunk.

  3. A nyelvi környezet Definitions window Itt definiáljuk a függvényeket Interactions window Itt történik a futtatás

  4. Példák (define (negyzet n) ( * n n) ) (define nagy-szam ( + (expt 2 10) (expt 3 100))) ---- > (negyzet 5) 25 > nagy-szam 515377520732011331036461129765621272702107523025

  5. A nyelv szintjei DrScheme a nyelvi szintek hierarchiáját nyújtja: • Beginning student: functions, structures, lists • Intermediate student • Advanced student • Scheme language level Minden szint a hibaüzeneteket a szintnek megfelelően fogalmazza meg. A szintek a szintaktikus és szemantikus korlátozásokban eltérnek, a felhasználó szintje szerint.

  6. Példa egy függvényre (define fac (lambda (n) (if (= n 0) 1 (* n (fac (- n 1))))))

  7. A DrScheme nyelv vázlatos ismertetése 1. • A Scheme program függvénydefiníciók halmaza, melyeket egymásba lehet ágyazni • A Scheme program végrehajtása egy kifejezés kiértékelését jelenti • A függvényeket (fvnev argumentumok) formában kell írni, például +3 (* 4 5)) ;; 3 + 4 * 5 (fac 3) ;; fac(3) • Az összeadás lehet több argumentumú (+ 1 2 3 4) ;; 10 • A szorzás is lehet több argumentumú (/ 36 6 2) ;; 3

  8. A DrScheme nyelv vázlatos ismertetése 2. • Listák:(length ‘(+ 2 3)) ;; 3length beépített függvény, (+ 2 3) egy 3-elemű lista, a ‘ megakadályozza a kiértékelést:(+ 2 3) ;; 5‘(+ 2 3) ;; (+ 2 3)

  9. cons car • cons (construct szóból) Beépített függvény, két argumentuma van és egy rendezett párt vagy listát ad vissza: (cons '1 '2)          ;;   (1 . 2)(cons '1 '(2 3 4))      ;;   (1 2 3 4)(cons '(1 2 3) '(4 5 6))  ;;  ((1 2 3) 4 5 6) • car rendezett pár vagy lista első elemét adja vissza(car '(123 245 564 898)) ;; 123(car '(egy ketto harom) ;; egy          

  10. cdr list • cdr a rendezett pár második elemét; vagy a lista fej nélküli részét szolgáltatja:(cdr '(7 6 5)); (6 5)(cdr '(5 . 16)) ; 16 listaelem!!(cdr '(5 26)) ; (26) lista!! (cdr '(it rains every day))  ;;  (rains every day)(cdr (cdr '(a b c d e f)))   ;;   (c d e f) • list készít egy listát a listaelemekből:(list 'a) ; (a)(list 'a 's 'd) ; (a s d)(list '(a b c) '(d e f) '(g h i)) is  ((a b c)(d e f)(g h i))

  11. cons és list különbsége: • (cons ’1 ’2) ; (1 . 2) • (list '1 '2) ; (1 2) • (cons '(3 4) '(5 6)) ; ((3 4) 5 6) • list '(3 4) '(5 6)) ; ((3 4) (5 6))

  12. length reverse append • (length '(1 2 3 4 5)) ; 5 • (length '((1 2 3 4 5) (7 8 9))) ; 2 • (reverse '( 1 2 3)) ; (3 2 1) • (append '(1 2) '(6 7 8 9)) ; (1 2 6 7 8 9)

  13. Trükkök • (append '(a b c) '()) • (list '(a b c) '() ) • (cons '(a b c) '() ) Scheme kód Lehetséges eredmények • ((a b c) ) • (a b c) • ((a b c) ()) Párosítás? Kattintson ide!

  14. A megfejtés 1 – B 2 – C 3 - A

  15. Gyakorlat… Tekintsük a (minden x (ha (ember x) (halando x))) listát, és adjuk meg a Scheme kódot, ami a minden, ha illetve ember szavakat előállítja! • (car '(minden x (if (ember x) (halando x)))) minden • (car (car (cdr (cdr '(minden x (if (ember x) (halando x))))))) ha • (car (car (cdr(car (cdr (cdr '(minden x (if (ember x) (halando x))))))))) ember

  16. Lambda kifejezések • A felhasználó által definiált függvények névvel nem rendelkező ún. lambda kifejezéseket használnak:(lambda (formális paraméter) kifejtés)Példa:((lambda (x) ( * x x)) 3) ; 9((lambda (x y) (+ x y)) 3 4) ; 7

  17. Fibonacci sorozat (define fib (lambda (n) (if (= n 0) 0 (if (= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))))

  18. Lnko (=gcd) (define gcd (lambda (a b) (if (= a b) a (if (> a b) (gcd (- a b) b) (gcd a (- b a))))))

  19. Ackermann-függvény

  20. x helyébe m-t, y helyébe n-t írva:(define ack   (lambda (m n)        (if (= m 0)                (+ n 1)         (if (= n 0)                      (ack (- m 1) 1)                      (ack (- m 1) (ack m (- n 1)))))))

  21. Kiszámíthatóság Az Ackermann függvény példa a kiszámítható, de nem primitíven kiszámítható függvényre. A kiszámíthatóság elméletével nem foglalkozunk (ld. Haladó algoritmusok tárgy).

  22. Listaelemek összeadása (define sum (lambda (lt) (if (null? lt) 0 (+ (car lt) (sum (cdr lt)))))) Futtatási példa:(sum '(1 2 3 4 5)) ; 15

  23. Listaelemek szorzata (define szoroz (lambda (lt) (if (null? lt) 1 (* (car lt) (szoroz (cdr lt))))))

  24. Felhasznált irodalom • http://www.math.grin.edu/courses/Scheme/spring-1997/lab-index.html • http://cs.wwc.edu/~cs_dept/KU/PR/Scheme.html#functions • http://mathworld.wolfram.com/AckermannFunction.html

More Related