Upload
rusti
View
41
Download
3
Embed Size (px)
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
Citation preview
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.
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”
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.
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.
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.
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
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).
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 …)
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.
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
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]
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.
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]
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.
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
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.
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
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.
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.
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…
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.
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
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)
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)
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)
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?
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)
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.
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.
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ú]
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.
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]
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!
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.
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.
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)
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)