Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Bevezetés a funkcionális programozásba 2009.

Hasonló előadás


Az előadások a következő témára: "1 Bevezetés a funkcionális programozásba 2009."— Előadás másolata:

1 1 Bevezetés a funkcionális programozásba 2009

2 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ő: A következőkben a funkcionális mag bemutatására koncentrálunk.

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

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

5 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 6 Példa egy függvényre (define fac (lambda (n) (if (= n 0) 1 (* n (fac (- n 1))))))

7 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)) ;; * 5 (fac 3) ;; fac(3) Az összeadás lehet több argumentumú ( ) ;; 10 A szorzás is lehet több argumentumú (/ ) ;; 3

8 8 A DrScheme nyelv vázlatos ismertetése 2. Listák: (length ‘(+ 2 3)) ;; 3 length 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 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)) ;; ( ) (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 (car '(egy ketto harom) ;; egy

10 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 11 cons és list különbsége: 1. (cons ’1 ’2) ; (1. 2) 2. (list '1 '2) ; (1 2) 3. (cons '(3 4) '(5 6)) ; ((3 4) 5 6) 4. list '(3 4) '(5 6)) ; ((3 4) (5 6))

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

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

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

15 15 Gyakorlat… (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 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!

16 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 17 Fibonacci sorozat (define fib (lambda (n) (if (= n 0) 0 (if (= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))))

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

19 19 Ackermann-függvény m\nm\n01234n n (n + 3) − (n + 3) − − 3A(3, − 3)A(3, A(4, 3)) A(4, 65533)A(4, A(5, 1))A(4, A(5, 2))A(4, A(5, 3)) 6A(5, 1)A(5, A(5, 1))A(5, A(6, 1))A(5, A(6, 2))A(5, A(6, 3))

20 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 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 22 Listaelemek összeadása (define sum (lambda (lt) (if (null? lt) 0 (+ (car lt) (sum (cdr lt)))))) Futtatási példa: (sum '( )) ; 15

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

24 24

25 25 Felhasznált irodalom index.html index.html


Letölteni ppt "1 Bevezetés a funkcionális programozásba 2009."

Hasonló előadás


Google Hirdetések