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

Nemrekurzív programozás ÜA LISP tartalmaz nemrekurzív eszközöket is, mivel azonban funkcionális nyelv, ezeket is függvényként használhatjuk. ÜSokszor a.

Hasonló előadás


Az előadások a következő témára: "Nemrekurzív programozás ÜA LISP tartalmaz nemrekurzív eszközöket is, mivel azonban funkcionális nyelv, ezeket is függvényként használhatjuk. ÜSokszor a."— Előadás másolata:

1 Nemrekurzív programozás ÜA LISP tartalmaz nemrekurzív eszközöket is, mivel azonban funkcionális nyelv, ezeket is függvényként használhatjuk. ÜSokszor a nemrekurzív függvények kevesebb tárat, ill. futási időt igényelnek.  Iteratív függvények: LISP-ben az iteráció egy forma többszörös kiértékelését jelenti. Egy meghatározott feltétel teljesülésétől függ, hogy meddig kell a kiértékelést ismételnünk.  Beépített függvények : DOTIMES, DOLIST, DO, DO*, LOOP

2 DOTIMES ÜSzintaxis: Ü(DOTIMES (indexváltozó n [eredm]) törzs)  Működés: n-szer értékeli ki a törzs et, miközben indexváltozó értéke: 0-tól n-1-ig megy. Ezután visszatéríti eredm értékét, mely ha hiányzik (ugyanis opcionális), NIL-t eredményez. ÜPélda: Ü> (DOTIMES (i 4) (FORMAT t "~&I értéke ~S." i))FORMAT I értéke 0. I értéke 1. I értéke 2. I értéke 3. NIL

3 DOLIST ÜSzintaxis: Ü(DOLIST (indexváltozó lista [eredm]) törzs)  Működés: habár ugyanaz a szintaxisa, mint a DOTIMES függvénynek, itt az indexváltozó értékeit egy lista elemeiből veszi. ÜPélda:  > (DOLIST (x ’(piros sárga fehér) ’virágok) (FORMAT t "~&A rózsák ~S színűek." x)) A rózsák PIROS színűek. A rózsák SÁRGA színűek. A rózsák FEHÉR színűek. VIRÁGOK

4 Ciklusból való kilépés: RETURN  A RETURN függvény alkalmazásakor a eredm értékét nem veszi figyelembe.  Példa: A következő függvény, ELSŐ-PLAN egy lista első páratlan elemét adja meg. A DOLIST segítségével végighaladunk a lista elemein, majd a RETURN függvénnyel lépünk ki, ha találtunk egy ilyen elemet. Ü(DEFUN ELSŐ-PLAN (SZÁMLISTA) (DOLIST (E SZÁMLISTA) (FORMAT T "~&Tesztelés ~S..." E) (WHEN (ODDP E) (FORMAT T „páratlan szám...") RETURN E))))

5 DOLIST és RETURN  A PLAN-VIZSGÁLAT függvény a DOLIST függvényt használja arra, hogy leellenőrizze egy lista minden elemét, páros számok-e. Ha igen, akkor a DOLIST eredménye a T szimbólum, különben rögtön leáll a ciklus, ha talál egy pá- ros elemet, és ekkor NIL -t ad vissza. Ü(DEFUN PLAN-VIZSGÁLAT (SZÁMLISTA) (DOLIST (E SZÁMLISTA T) (FORMAT T " ~& ~S vizsgálata..." E) (IF (NOT (ODDP E)) (RETURN NIL))))

6 Rekurzív, ill. iteratív keresés összehasonlítása  (DEFUN REK-ELSO-PLAN (X) ;rekurzív definíció (COND ((NULL X) NIL) ((ODDP (FIRST X)) (FIRST X)) (T (REK-ELSO-PLAN (REST X)))))  (DEFUN ITER-ELSO-PLAN (X) ;iteratív definíció (DOLIST (E X) (IF (ODDP E) (RETURN E))))

7 Rekurzív, ill. iteratív keresés összehasonlítása ÜSokszor kis előnyökkel jár az iteráció használata:  A megállási feltétel implicit: DOLIST mindig megáll, amikor a lista végére ér.  Iteratív esetben az E változó a lista egymás utáni elemeire utal. A rekurzív verzió esetében X a listának a farkát jelöli, majd annak a farkát és így tovább... ÜMáskor a rekurzió egyszerűbb és természetesebb, mint az iteráció:  Például könnyebb, elegánsabb CAR/CDR rekurzióval keresni egy fában, mint iteratívan.

8 Faktoriális iteratívan  Hozzárendelés, avagy a LET függvény használata iteratív függvény definiálásakor: Ü(DEFUN ITER-FAKT (N) (LET ((SZORZAT 1)) (DOTIMES (I N SZORZAT) (SETF SZORZAT (* SZORZAT (+ I 1))))))

9 Halmazok metszete iteratívan Ü(DEFUN ITER-INTERSECTION (X Y) (LET ((VÉGSŐ NIL)) (DOLIST (ELEM X VÉGSŐ) (WHEN (MEMBER ELEM Y) (PUSH ELEM VÉGSŐ)))))  Megjegyzések: 1.Az ELEM változó az X halmaz elemein fut végig (megköti az elemeket  bound) 2.PUSH  makrófüggvény, lista elejére (verembe) betesz egy adott elemet. Társa: POP  veremből kiveszi az utolsó elemet (ti. a lista fejét). Destruktívak!!!

10 DOLIST ? MAPCAR ? REKURZIÓ? ÜMAPCAR a legegyszerűbb mód egy függvényt egy adott listra elemeire alkalmazni. Ü(DEFUN NÉGYZET-LISTA (SZÁMLISTA) (MAPCAR #’(LAMBDA (N) (* N N)) SZÁMLISTA)) ÜA rekurzív megoldás bonyolultabb... Ü(DEFUN REK- NÉGYZET-LISTA (X) (COND ((NULL X) NIL) (T (CONS (* (FIRST X) (FIRST X)) (REK-NÉGYZET-LISTA (REST X)))))) ÜIteratív módszer: a DOLIST használatakor fel kell építenünk a megoldást explicit értékadással. Ü(DEFUN ITER- NÉGYZET-LISTA (SZÁMLISTA) (LET ((EREDM NIL)) (DOLIST (E SZÁMLISTA (REVERSE EREDM)) (PUSH (* E E) EREDM))))

11 DO  A legerősebb iterációs forma Lispben. Bármely számú változót képes megkötni, akárcsak a LET ( egyszerre ) ; ÜSegítségével bonyolultabb ciklusokat építhetünk fel. ÜSzintaxisa: Ü(DO ((vált1 kezdért1 [lépés1]) (vált2 kezdért2 [lépés2]) ; DO -változók listája...) (feltétel tev-1... tev-n) ;megállási feltétel törzs)

12 DO  A DO -változók lokális változók. Kezdeti értéket rendelhetünk hozzájuk, különben NIL lesz az értékük.  Az utolsó S-kifejezés után nem fejeződik be a DO kiértékelése, hanem újra kiértékelődik a feltétel, és azt követően minden S- kifejezés, egészen addig, amíg a feltétel értéke igaz nem lesz. Ekkor értékelődik ki a megállási feltétel után álló tevékenység, és ennek értéke lesz a DO kifejezés visszatérő értéke.

13 A DO alkalmazása Ü(DEFUN FAKT (N) (DO ((I N (- I 1)) (EREDM 1 (* EREDM I))) ((ZEROP I) EREDM))) Ü(DEFUN IT-INTERSECTION (X Y) (DO ((X1 X (REST X1)) (EREDM NIL (IF (MEMBER (FIRST X1) Y) (CONS (FIRST X1) EREDM) EREDM))) ((NULL X1) EREDM))) Ü(DEFUN ELSO-PLAN-DO SZÁMLISTA) (DO ((X SZÁMLISTA (REST X))) ((NULL X) NIL) (IF (ODDP (FIRST X)) (RETURN (FIRST X)))))

14 DO*  A DO* iteratív forma ugyanazzal a szintaxissal rendelkezik, mint a DO, csak ez szekvenciálisan (sorrendben) hozza létre és frissíti a változókat, mint a LET*, tehát nem egyszerre, mint a LET.  Előnye az ELSŐ-PLAN típusú függvényekhez képest az, hogy segítségével értelmezni tudunk egy második indexváltozót, hogy együtt tartsuk egy lista egymásutáni elemeit, míg az első indexváltozó a lista farkára teszi ugyanezt: Ü(DEFUN ELSŐ-PLAN-DO* (SZÁMLISTA) (DO* ((X SZÁMLISTA (REST X)) (E (FIRST X) (FIRST X))) ((NULL X) NIL) (IF (ODDP E) (RETURN E))))

15 Feladatok  Írjatok a ITER-MEMBER néven iteratív függvényt egy elem adott listában való megvizsgálására ( T vagy NIL legyen a visszatérített érték). ÜÉs hasonlóképpen: ÜITER-LENGTH ÜITER-NTH ÜITER-UNION ÜITER-REVERSE ÜITER-MAX

16 FORMAT  A FORMAT függvény segítségével dolgokat tudunk kiírni a képernyőre vagy egy adott állományba. Első argumentuma a T szimbólum, ha a képernyőre íratunk ki. Második argumentuma egy karakterfűzér.  Formatálási derektívákat is használhatunk, amelyek a ~ karakterrel kezdődnek. A ~% direktíva új sorba lépést eredményez. Ü> (FORMAT T „Első sor...~%ez már a második...") Első sor... ez már a második... NIL  A ~& direktíva új sorba lépést eredményez, kivéve ha nem vagyunk már egy új sor elején.  Egy másik formatálási direktíva a ~S, amely beszúrja egy Lisp objektum nyomtatási képét az üzenetbe, amit a FORMAT ki kell írjon. Ü(DEFUN BESZÉDES-NÉGYZET (N) (FORMAT T "~&~S négyzete ~S" N (* N N))) > (BESZÉDES-NÉGYZET 10) 10 négyzete 100 NIL Vissza

17 Input/Output  FORMAT: formázott kiíratás FORMAT Ü>(FORMAT t “(Atom ~S lista ~S~%majd egész ~D~%” nil (list 5 6) 7) Atom NIL lista (5 6) majd egész 7 NIL  READ: beolvasás a billenytűzetről program-vezérlés közben. Ü(DEFUN NÉGYZET () (FORMAT T „Kérem, adja meg a számot: ") (LET ((X (READ))) (FORMAT T "~S négyzete ~S.~%" X (* X X))))  > ( NÉGYZET ) Kérem, adja meg a számot: 7 7 négyzete 49. NIL

18 Fájlkezelés ÜREAD-LINE ÜPRINT ÜWRITE ÜWRITE-LINE ÜWRITE-STRING ÜWRITE-CHAR ÜOPEN ÜCLOSE

19 PÉLDA ÜA következő program állományt hoz létre, melyet a felhasználó feltölthet adatokkal, majd kilistázhatja a tartalmát.következő ÜForrás: http://people.inf.elte.hu/istenes/lisp/ felev-2001-osz/gyak4.txt


Letölteni ppt "Nemrekurzív programozás ÜA LISP tartalmaz nemrekurzív eszközöket is, mivel azonban funkcionális nyelv, ezeket is függvényként használhatjuk. ÜSokszor a."

Hasonló előadás


Google Hirdetések