a rekurzió mint típuskonstrukció

37
A rekurzió mint A rekurzió mint típuskonstrukci típuskonstrukci ó ó Szlávi Péter ELTE Média- és Oktatásinformatikai Tanszék [email protected] http://people.inf.elte.hu/szlavi 2009 1 1 . .

Upload: rusti

Post on 19-Mar-2016

41 views

Category:

Documents


3 download

DESCRIPTION

A rekurzió mint típuskonstrukció. 1. Szlávi Péter ELTE Média- és Oktatásinformatikai Tanszék [email protected] http://people.inf.elte.hu/szlavi 2009. 1 Nevezetes rekurzív adatszerkezetek 2 Rekurzív adatszerkezetek definiálása 1.1 A rekurzió mint sokaság 1.2 A rekurzió mint rekord-analogon - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: A rekurzió mint  típuskonstrukció

A rekurzió mint A rekurzió mint típuskonstrukció típuskonstrukció

Szlávi PéterELTE Média- és Oktatásinformatikai Tanszék

[email protected] http://people.inf.elte.hu/szlavi

2009

1. 1.

Page 2: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 2/3823.04.24.

TartalomTartalom

1 Nevezetes rekurzív adatszerkezetek2 Rekurzív adatszerkezetek definiálása

1.1 A rekurzió mint sokaság1.2 A rekurzió mint rekord-analogon

3 A struktúrabejárás mint a feldolgozás „kerete”

Page 3: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 3/3823.04.24.

1 Nevezetes rekurzív adatszerkezetek1 Nevezetes rekurzív adatszerkezetek

ÜresListaLista :=

Egyesítés(Elem,Lista) ÜresFa

BinFa:= Egyesítés(Elem,BinFa,BinFa)

ÜresFaFa :=

Egyesítés(Elem,Fák)

A A sokaságsokaságoknál definiált oknál definiált ÜresÜres művelet.művelet.

A A sokaságsokaságoknál definiált oknál definiált EgyesítésEgyesítés műveletművelet.

Page 4: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 4/3823.04.24.

1 Nevezetes rekurzív adatszerkezetek1 Nevezetes rekurzív adatszerkezetek

Az Egyesítés két értelmezési lehetősége („filozófia”): sokaságsokaság (a mikroszerkezet hangsúlyozása: azonos típusú

Elemekből épül föl valahogyan) egy „furcsa” direktszorzatdirektszorzat (a makroszerkezet hangsú-

lyozása: egyenrangú, de nem azonos típusú részekből, még-pedig Elemből és valami, az egészre emlékeztetőből áll).

A részek elérésének programozástechnikája: értékmegosztással (láncolással/mutatóval) értékmásolással.

Page 5: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 5/3823.04.24.

1 Nevezetes rekurzív adatszerkezetek1 Nevezetes rekurzív adatszerkezetek

A rekurzív adatszerkezet jellemzői: sokaság: azonos típusú elemekből áll akár 0 db elemet tartalmazhat Üres: rekurzív „nullelem”, kitüntetett konstans Fraktál (=önhasonlóság) tulajdonság: a részei

ugyanolyan szerkezetűek, mint az egész nem lineárisan rendezett (azaz nem sorozatféle):

bármely elemének 0, 1, 2… (közvetlen) rákövetke-zője lehet; bár minden elemnek legfeljebb egy (közvetlen) előzője van.

Page 6: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 6/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

2.0 Rekurzió egy típuskonstrukciós eszköz2.0 Rekurzió egy típuskonstrukciós eszköz

Megjegyzések: Csak 1 nem rekurzív komponens („mező”) lehet.

(Ez nem valódi korlátozás!!!) A rekurzív komponensek típusa a „teljes” (definiálandó) típussal

kötelezően megegyező. Szelektorok elő fognak fordulni paraméterként, ezért bevezetjük

a Szelektor kulcs-szót. (Tulajdonképpen egy spec. típus, l. később.)

Típus TRek=Rekurzió(szelektor1:TElem szelektor2 :TRek …)

Vö.: Szelektor Vö.: Szelektor Mutató-típusokMutató-típusok

Page 7: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 7/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Nem véletlen a szintaktikai hasonlóság a rekorddal. A műveleteik is sokban emlékeztetnek majd egymásra.

Sajátos gond: nehéz az „egzakt” szintaxisú leírása. Oka –akárcsak a rekordnál–: a tetszőleges számú paraméter (bár itt csak kétféle típusú lehet).

Page 8: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 8/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Példák:

Típus TLista=Rekurzió(elem:TElem farok:TLista)

Típus TBinFa=Rekurzió(elem:TElem bal, jobb:TBinFa)

Típus TFa=Rekurzió(elem:TElem

ágak:Sorozat(TFa))

Sokaság filozófiájával Sokaság filozófiájával aposztrofálva a rekurzív ágat:aposztrofálva a rekurzív ágat:

Típus TLista=Rekurzió(elem:TElem kövköv:TLista)

A Sorozat csak jelzése valamely A Sorozat csak jelzése valamely ismert sorozatfélének (ismert sorozatfélének (TömbTömb, ,

AbAbsztraktsztraktSorSorozat …)ozat …)

Page 9: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 9/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

2.1 Rekurzió mint sokaság2.1 Rekurzió mint sokaságSajátossága: A rekurzió elemek sokasága, így szükséges lesz

kezeléséhez • egy kezdő (gyökér)-elemre (amely a teljes szerkezetet

„összetartja”), • egy aktuális elemre (amelyre a legtöbb művelet vonat-

kozni fog).

Az algebrai Az algebrai specifikáció: hf.specifikáció: hf.

Page 10: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 10/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

2.1.1 A rekurzió exportmodulja2.1.1 A rekurzió exportmodulja a modulfejben tisztázni kell a felhasználás szinta-

xisát, de ezt most nem lehet teljesen egzakt módon, mivel változó számú paraméterrel rendelkezik.

Típus TRek= Rekurzió(eszel:TElem,rszel1,…:TRek)

ExportModul Rekurzió(eszel:TElem,rszel1,…:TRek):

Formálisabban (szintaktikus ellenőrzés lehetőségét lehetővé téve): ExportModul Rekurzió(Konstans eszel:Szelektor,

Típus TElem,Konstans rszel1,…:Szelektor, Típus TRek):

Másként Rekurzió(eszel:TElem,rszel1,…:TRek)

A hívás szintaxisaA hívás szintaxisa

Page 11: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 12/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Kísérlet az exportmodul „egzakttá” tételére: Kísérlet az exportmodul „egzakttá” tételére: * bináris fa rekurzív típusának definiálása:

* … és exportmodulja:

Lényeg: a típuskonstrukciónál csak a minimálisan szük-séges számú paraméter szerepeljen! Nem erőltetjük a rekurzivitás explicit kifejezését.

Típus TBFSzel=(elem,bal,jobb) [felsorolási típus]TElem=…TBF=Rekurzió(TElem,TBFSzel)

ExportModul Rekurzió(Típus TElem, Típus TRSzel): [hivatkozás a(z) * nem rekurzív komponensre: Min’TRSzel szelektorral * 1. rekurzív komponensre: Következő(Min’TRSzel) * … * utolsó rekurzív komponensre: Max’TRSzel]

Page 12: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 13/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Exportmodul:Exportmodul:ExportModul Rekurzió(eszel:TElem,rszel1 …:TRek):

Függvény Üres?(Konstans r:TRek):Logikai [Uf: a „teljes” r üres-e?] Konstans Üres:TRek [Uf: 0 db elemből álló struktúra] Eljárás Létrehoz(Konstans e:TElem, Változó r:TRek) [Uf: r 1-elemű rekurzív struktúra] Megjegyzés: nem küszöbölhető ki, ui.: az Illeszt az egyetlen „bővítő” operátor, ami bővíteni csak akkor tud, ha legalább 1-elemű rekurzív struktú- rákkal manipulál. Eljárás Illeszt(Konstans mit:TRek,

Változó mihez:TRek, Konstans melyik:Szelektor)

[Ef: Üres?(mihez) vagy Üres?(Rész(mihez,melyik) Uf: Két azonos típusú rekurzív szerkezetet egymáshoz illeszt, a mihez akt-jánál, a melyik-en keresztül]

Precízebben:Precízebben:Szelektor’TRekSzelektor’TRek

Most a szokásos, nem Most a szokásos, nem teljesen egzakt teljesen egzakt

jelöléssel folytatjuk.jelöléssel folytatjuk.

Page 13: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 14/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Eljárás Leválaszt(Változó miről:TRek, Konstans melyik:Szelektor, Változó mire:TRek)

[Ef: Üres?(mire) Uf: a miről leválasztja az akt melyik szelektorán kapcsolódó részt, s a mire akasztja; az adott ágat üressé teszi] Függvény Elem(Konstans r:TRek):TElem [Uf: az akt elem értéke] Függvény Rész(Konstans minek:TRek,

melyik:Szelektor):TRek [Uf: a minek struktúra az akt-ról a melyik szelektorán „lógó” rész-struktúrát adja vissza értékmegosz- tással, azaz annak a memóriacímét, mutatóját] Eljárás Lemásol(Konstans mit:TRek, Változó mire:TRek) [Ef: Üres?(mire) Uf: mit akt-ból kiinduló rész pontos másolatát a mire akasztja]

Page 14: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 15/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Nem mondtuk ki, legtöbb operáció előfeltételének elvárt része:létezzék az akt elem, és melyik≠Min’Szelektor!

Eljárás Felszabadít(Változó r:TRek) [Uf: felszabadítja az akt-ból eredő rész-struktúra által lefoglalt memóriaterületet] Eljárás Módosít(Konstans e:TElem, Változó r:TRek) [Uf: az r akt elemét e-re módosítja] Eljárás Elsőre(Változó r:TRek) [Uf: a gyökért teszi aktuálissá] Eljárás Következőre(Változó r:TRek

Konstans melyik:Szelektor) [Uf: az akt elem melyik szelektorán továbblép, ha lehet] Függvény Elején?(Konstans r:TRek):Logikai [Uf: az akt elem a struktúra gyökéreleme-e?] Függvény Végén?(Konstans r:TRek):Logikai [Uf: az akt elem valamelyik terminális elem-e?] Modul vége.

Page 15: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 16/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

2.1.2 A rekurzió megvalósítási modulja2.1.2 A rekurzió megvalósítási moduljaReprezentáció – láncolt: Reprezentáció – láncolt: Modul Rekurzió(eszel:TElem,rszel1,…:TRek): Reprezentáció [láncolt]

Típus TRElem=Rekord(eszel:TElem, rszel1, … :TRElem’Mutató)

TRek=Rekord(gyökér:TRElem’Mutató akt:TRElem’Mutató hiba:Logikai)

Változó r:TRek

Ez a típus „glo-Ez a típus „glo-bális” neve is.bális” neve is.

Ez dönt a típus me-Ez dönt a típus me-mórialefoglalásról.mórialefoglalásról.

Pascal-ban: Pascal-ban: ^TRElem^TRElem

Page 16: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 17/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

ImplementációImplementáció::

Implementáció

Függvény Üres?(Konstans r:TRek):Logikai Üres?:=r.gyökér=Sehova Függvény vége.

Konstans Üres:TRek(Sehova,Sehova,Hamis) Eljárás Létrehoz(Konstans e:TElem, Változó r:TRek): Lefoglal(r.gyökér,TRElem(e,Sehova,…)) Eljárás vége.

Page 17: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 18/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Eljárás Illeszt(Konstans mit:TRek, Változó mihez:TRek,

Konstans melyik:Szelektor): [Ef: mihez.gyökér=Sehova (mihez.aktSehova melyik≠eszel TRElem(mihez.akt).melyik=Sehova)] Elágazás Üres?(mihez) esetén

mihez:=mit egyéb esetben

TRElem(mihez.akt).melyik:=mit.gyökér Elágazás vége Eljárás vége. Eljárás Leválaszt(Változó miről:TRek,

Konstans melyik:Szelektor, Változó mire:TRek):

[… hf …]

Jól-definiáltságJól-definiáltság

Pascal-ban: Pascal-ban: mihez.akt^.melyikmihez.akt^.melyik

Hogy ne vesszen el Hogy ne vesszen el elemelem

Page 18: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 19/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Függvény Elem(Konstans r:TRek):TElem [Ef: r.akt≠Sehova] Elem:=TRElem(r.akt).eszel Függvény vége. Függvény Rész(Konstans minek:TRek,

melyik:Szelektor):TRek [Ef: minek.akt≠Sehova melyik≠eszel] Rész:=TRek(TRElem(minek.akt).melyik [gyökér]

TRElem(minek.akt).melyik [akt], Hamis) Függvény vége. Eljárás Lemásol(Konstans mit:TRek, Változó mire:TRek): [… hf …] Eljárás Felszabadít(Változó r:TRek) [… hf … Figyelem: értékmegosztás miatt többszörös felhasználás lehetséges!!! (hivatkozás-számláló)] Eljárás Módosít(Konstans e:TElem, Változó r:TRek): [Ef: r.akt≠Sehova] TRek(r.akt).eszel:=e Eljárás vége.

Page 19: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 20/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Eljárás Elsőre(Változó r:TRek): [Ef: r.akt≠Sehova r.gyökér≠Sehova] r.akt:=r.gyökér Eljárás vége.

Eljárás Következőre(Változó r:TRek, Konstans melyik:Szelektor):

[Ef: r.akt≠Sehova melyik≠eszel TRElem(r.akt).melyikSehova] r.akt:=TRElem(r.akt).melyik Eljárás vége.

Függvény Elején?(Konstans r:TRek):Logikai [… hf …] Függvény Végén?(Konstans r:TRek):Logikai [… hf …]

Inicializálás r:=ÜresModul vége.

Page 20: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 21/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Példaként egy érték megkeresése a TRek típuskonstrukció műveleteire építve:

Függvény RekKer(Konstans r:TRek, e:TElem):TRek [Ef: – vagy Elején?(r) Uf: er Elem(RekKer(r,e))=e Elején?(RekKer(r,e)) er Üres?(RekKer(r,e))] Változó

melyik:Szelektor’TRekkész:Logikairm:TRek

Ha Üres?(r) akkorRekKer:=Üres

különben…

Page 21: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 22/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

… különben

Ha Elem(r)=e akkor RekKer:=r

különben melyik:=Következő(Min’Szelektor’TRek) kész:=Hamis Ciklus amíg melyikMax’Szelektor’TRek és nem

kész rm:=RekKer(Rész(r,melyik),e) kész:=nem Üres?(rm) [és Elem(rm)=e] Ha melyik<Max’Szelektor’TRek akkor

melyik:=Következő(melyik) különben

kész:=Igaz Elágazás vége Ciklus vége RekKer:=rm

Elágazás vége Elágazás vége Függvény vége.

A nem rekurzív A nem rekurzív mező szelektora.mező szelektora.

Page 22: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 23/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Az értékmegosztás problematikájának egy példája: A bf „kétszeresen balra eső” részfájának leválasztása:

Elsőre(bf); Leválaszt(Rész(bf,bal),bal,bf2)

bf

Elsőre(bf)

Rész(bf,bal) Leválaszt(Rész(bf,bal),bal,bf2)

Rész(bf,bal),bal

Page 23: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 24/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

A helyfelszabadítás és az értékmegosztás problemati-kájának egy példája: Kövessük az alábbi példát:

Elsőre(bf); jbf:=Rész(bf,jobb); bf:=Rész(bf,bal)jÉrt:=Feldolgoz(jbf) [jbf változatlan]bÉrt:=Feldolgoz(bf) [bf változatlan]Felszabadít(jbf)bf

Elsőre(bf) jbf:=Rész(bf,jobb)

Page 24: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 25/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

A helyfelszabadítás és az értékmegosztás problemati-kájának egy példája: Kövessük az alábbi példát:

Elsőre(bf); jbf:=Rész(bf,jobb); bf:=Rész(bf,bal)jÉrt:=Feldolgoz(jbf) [jbf változatlan]bÉrt:=Feldolgoz(bf) [bf változatlan]Felszabadít(jbf)bf

jbfbf:=Rész(bf,bal)

Page 25: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 26/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

A helyfelszabadítás és az értékmegosztás problemati-kájának egy példája: Kövessük az alábbi példát:

Elsőre(bf); jbf:=Rész(bf,jobb); bf:=Rész(bf,bal)jÉrt:=Feldolgoz(jbf) [jbf változatlan]bÉrt:=Feldolgoz(bf) [bf változatlan]Felszabadít(jbf)bf

jbfjÉrt:=Feldolgozás(jbf); bÉrt:=Feldolgozás(bf)

Page 26: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 27/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

A helyfelszabadítás és az értékmegosztás problemati-kájának egy példája: Kövessük az alábbi példát:

Elsőre(bf); jbf:=Rész(bf,jobb); bf:=Rész(bf,bal)jÉrt:=Feldolgoz(jbf) [jbf változatlan]bÉrt:=Feldolgoz(bf) [bf változatlan]Felszabadít(jbf)bf

jbfFelszabadít(jbf)

? Problémák:• A felszabadítás után „csellengő” hivatkozások

keletkeznek!• Mi lesz az értékadás után a baloldali változó

„egykori” értékével?

Page 27: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 28/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Egy tisztességes megoldás ötlete:• Hivatkozás- („tulajdonos”-) számlálás.• Felszabadítás intelligensebbé tétele.Megvalósítás felé: 1. Reprezentáció-módosítás

minden rekurzív elemnek tulajdonos-számlálót2. Implementáció-módosítás (hol kell a számlálóval

foglalkozni?)• Értékadáskor• Eljáráshíváskor

a paraméterek vonatkozásában• Függvényhíváskor

a paraméterek, fv.-érték vonatkozásában• Kifejezésekben

Tartós értékmegosztás történik: Tartós értékmegosztás történik:

Csak időleges Csak időleges értékmegosztás értékmegosztás

történik: történik: (=nem kell)(=nem kell)

Page 28: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 29/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Érdemes a részleteket meggondolniPl. a b:=fv(bb) értékadást valósítsuk meg az

Értékadás(b,fv(bb)) eljárással.

Eljárás Értékadás(Változó b:TRek, Konstans bb:TRek): TulajdonostCsökkent(b)[b-től kiindulva az összes elem tulajdonos-

számlálóját 1-gyel csökkenti, és a 0

tulajdonos-számúak helyét felszabadítja] b:=bb [címmegosztás] TulajdonostNövel(b) [b-től kiindulva az összes elem tulajdonos-

számlálóját 1-gyel növeli]Eljárás vége.

Page 29: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 30/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

2.2 Rekurzió mint rekord-analogon2.2 Rekurzió mint rekord-analogonElőzetes megjegyzések: ez az „igazi”, rekurzióhoz illeszkedő elképzelés a leírás nem teljesen „egzakt” formális okok miatt hihetetlenül egyszerű „nyelvezetű”, mindössze 4

műveletet definiálunk:• Üres• Üres?• a mezőkhöz való értékhozzáférés• a mezőkhöz való módosítási célú hozzáférés

Az algebrai Az algebrai specifikáció: hf.specifikáció: hf.

Page 30: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 31/3823.04.24.

2 Rekurzív adatszerkezetek 2 Rekurzív adatszerkezetek definiálásadefiniálása

2.22.2.1.1 A rekurzió exportmoduljaA rekurzió exportmodulja

ExportModul Rekurzió(eszel:TElem,rszel1,…:TRek):

Függvény Üres?(Konstans r:TRek):Logikai Konstans Üres:TRek Operátor Mező(Konstans r:TRek,

melyik:Szelektor):TElem TRekMásnéven r.melyik

[Ef: melyik=eszel melyik=rszel1 … Uf: az r melyik szelektora által kijelölt komponense, amely ha melyik=eszel, akkor TElem, ha melyik=rszeli, akkor TRek típusú]

Page 31: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 32/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Gondolja meg, miért nincs szükség néhány korábbi műveletre; pl. az

Elem, a Rész, a Következő műveletre? nem megvalósítható az Elsőre művelet?

Operátor Legyen(Változó r:TRek, Konstans melyik:Szelektor, er:TElem TRek)

Másnéven r.melyik:=er [Ef: (melyik=eszel er:TElem) (melyik=rszeli er:TRek) Uf: az r melyik szelektora által kijelölt komponense értékül kapja az er-t, vagyis „r.melyik:=er”, amely ha melyik=eszel, akkor TElem, ha melyik=rszeli, akkor TRek típusú adatok között megy végbe]Modul vége.

Hf: megoldani az új jelölésekkel.Hf: megoldani az új jelölésekkel.

Page 32: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 33/3823.04.24.

Egy „szintaktikai” példa:

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Típus TBinFa=Rekurzió(ért:TElem, bal,jobb:TBinFa)Változó b1,b2:TBinFa e:TElem

b1:=Üres; b2:=TBinFa(e,Üres,b1) [egy-elemű bifa] … e:=b2.ért; b1:=b2.bal [a binfa részeihez férés] … b1.ért:=e; b1.bal:=b2.jobb [binfa részek módosítása] … b2:=TBinFa(b1.ért,b1.jobb,b1.bal) [binfa-komponálás]

Page 33: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 34/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Modul Rekurzió(eszel:TElem,rszel1,…:TRek): Reprezentáció Típus TRElem=Rekord(eszel:TElem

rszel1, …: TRElem’Mutató)

TRek=TRElem’Mutató Változó r:TRek Implementáció Függvény Üres?(Konstans r:TRek):Logikai

Üres?:=r=Sehova Függvény vége. Konstans Üres:TRek(Sehova) Operátor Mező(Konstans melyik:Szelektor,

r:TRek):TElem TRekMásnéven r.melyikMező:=TRElem(r).melyik

Operátor Vége.

Vö.: a sokaság-szerűvel!Vö.: a sokaság-szerűvel!

Gondolja meg a Gondolja meg a hibaflag-gel bővítést!hibaflag-gel bővítést!

Page 34: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 35/3823.04.24.

2 Rekurzív adatszerkezetek definiálása2 Rekurzív adatszerkezetek definiálása

Megjegyzés:ez esetben is választható az „intelligens”, tulajdo-nos-számlálós implementáció, amely a TRek-típusú értékadások intelligens megvalósítását jelenti

Operátor Legyen(Változó r:TRek, Konstans melyik:Szelektor, er:TElem TRek)

Másnéven r.melyik:=erTRElem(r).melyik:=er

Operátor Vége. Inicializálás r:=ÜresModul vége.

Page 35: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 36/3823.04.24.

3 Struktúrabejárás mint a feldolgozás 3 Struktúrabejárás mint a feldolgozás keretekerete

• Feldolgozás sokaságFeldolgozás sokaság--szemlélettel:szemlélettel:

• Feldolgozás rekordFeldolgozás rekord--szemlélettel: szemlélettel:

Eljárás RFeld(Konstans r:TRek): Ha nem Üres?(r) akkor EFeld(Elem(r))

RFeld(Rész(r,rszel1))RFeld(Rész(r,rszel2))…

Elágazás vége Eljárás vége.

Eljárás RFeld(Konstans r:TRek): Ha nem Üres?(r) akkor EFeld(r.eszel)

RFeld(r.rszel1)RFeld(r.rszel2)…

Elágazás vége Eljárás vége.

Page 36: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 37/3823.04.24.

3 Struktúrabejárás mint a feldolgozás 3 Struktúrabejárás mint a feldolgozás keretekerete

Példák:Példák:• Listabejárás:

Eljárás LBejár(Konstans l:TLista): Ha nem Üres?(l) akkor Ki: Elem(l)

LBejár(Rész(l,farok))Eljárás vége.

Eljárás LBejár(Konstans l:TLista): Ha nem Üres?(l) akkor Ki: l.elem

LBejár(l.farok)Eljárás vége.

Elhagyható Elhagyható lenne!lenne!

Lehet tetszőleges Lehet tetszőleges elem-feldolgozás.elem-feldolgozás.

Hívása:Hívása:Elsőre(l); LBejár(l)

Hívása:Hívása:LBejár(l)

Page 37: A rekurzió mint  típuskonstrukció

A rekurzió mint típuskonstrukció 1. 38/3823.04.24.

3 Struktúrabejárás mint a feldolgozás 3 Struktúrabejárás mint a feldolgozás keretekerete

az algoritmikus rekurzió iterációvá alakítása az algoritmikus rekurzió iterációvá alakítása egyszerű a egyszerű a jobbrekurziójobbrekurzió miatt: miatt:

Eljárás LBejár(Konstans l:TLista): Változó sl:TLista sl:=l; Elsőre(sl) Ciklus amíg nem Üres?(sl) Ki: Elem(l) sl:=Rész(sl,farok) Ciklus végeEljárás vége.

Eljárás LBejár(Konstans l:TLista): Változó sl:TLista sl:=l Ciklus amíg nem Üres?(sl) Ki: Elem(l) sl:=sl.Farok Ciklus végeEljárás vége.

sl:=Következőre(sl,farok)

Végén?(sl)