Rekurzi 3 Szlvi Pter ELTE Informatika Szakmdszertani Csoport

  • Slides: 41
Download presentation
Rekurzió 3. Szlávi Péter ELTE Informatika Szakmódszertani Csoport szlavi@ludens. elte. hu http: //izzo. inf.

Rekurzió 3. Szlávi Péter ELTE Informatika Szakmódszertani Csoport szlavi@ludens. elte. hu http: //izzo. inf. elte. hu/szlavi 2000 Rekurzió 3

 Tartalom 0 Bevezetés 0. 1 A rekurzió lényege; „klasszikus” példák 0. 2 A

Tartalom 0 Bevezetés 0. 1 A rekurzió lényege; „klasszikus” példák 0. 2 A rekurzió helye a programkészítés folyamatában 1 Rekurzív specifikáció 1. 1 Formalizmus 1. 2 Példák 2 Rekurzív specifikáció és rekurzív algoritmus 3 Rekurzió megvalósítása nem rekurzív környezetben 3. 1 Problémák 3. 2 Példák 3. 3 A valódi megoldás ötlete, avagy mit tesz egy fordító program? 2021. 10. 25. Rekurzió 3 2

 Tartalom 4 Rekurzió és iteráció 4. 1 Oda 4. 1. 0 Bajok a

Tartalom 4 Rekurzió és iteráció 4. 1 Oda 4. 1. 0 Bajok a rekurzióval 4. 1. 1 Rekurzív függvények 4. 1. 2 Jobbrekurzió 4. 1. 3 Balrekurzió 4. 2 Vissza 4. 2. 0 A „dolog értelme” 4. 2. 1 Ciklusok átírása 5 Rekurzív típusok 5. 1 Nevezetes rekurzív adatszerkezetek 5. 2 Rekurzív adatszerkezetek definiálása 5. 3 A struktúrabejárás mint a feldolgozás „kerete” 2021. 10. 25. Rekurzió 3 3

 Tartalom 6 Rekurzív adattípusok: fák 6. 1 Bináris fák 6. 2 Nem bináris

Tartalom 6 Rekurzív adattípusok: fák 6. 1 Bináris fák 6. 2 Nem bináris fák 6. 3 B-fák 2021. 10. 25. Rekurzió 3 4

 5 Rekurzív típusok 5. 1 Nevezetes rekurzív adatszerkezetek Üres. Lista : = Egyesítés(Elem,

5 Rekurzív típusok 5. 1 Nevezetes rekurzív adatszerkezetek Üres. Lista : = Egyesítés(Elem, Lista) Üres. Fa Bin. Fa: = Egyesítés(Elem, Bin. Fa) Üres. Fa Fa : = Egyesítés(Elem, Fák) 2021. 10. 25. Rekurzió 3 A sokaságoknál definiált Üres művelet. A sokaságoknál definiált Egyesítés művelet 5

 5 Rekurzív típusok (folytatás) Az Egyesítés két értelmezési lehetősége („filozófia”): à sokaság (a

5 Rekurzív típusok (folytatás) Az Egyesítés két értelmezési lehetősége („filozófia”): à sokaság (a mikroszerkezet hangsúlyozása: azonos típusú Elemekből épül föl valahogyan) à egy „furcsa” direktszorzat (a makroszerkezet hangsú- lyozása: egyenrangú, de nem azonos típusú részekből, mégpedig 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. 2021. 10. 25. Rekurzió 3 6

 5 Rekurzív típusok (folytatás) A rekurzív adatszerkezet jellemzői: à sokaság: azonos típusú elemekből

5 Rekurzív típusok (folytatás) 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… rákövetkezője lehet. 2021. 10. 25. Rekurzió 3 7

 5 Rekurzív típusok (folytatás) 5. 2 Rekurzív adatszerkezetek definiálása 5. 2. 0 Rekurzió

5 Rekurzív típusok (folytatás) 5. 2 Rekurzív adatszerkezetek definiálása 5. 2. 0 Rekurzió egy típuskonstrukciós eszköz Típus TRek=Rekurzió (szelektor 1: TElem szelektor 2 : TRek …) 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. ) 2021. 10. 25. Rekurzió 3 8

 5 Rekurzív típusok (folytatás) à à Nem véletlen a szintaktikai hasonlóság a rekorddal.

5 Rekurzív típusok (folytatás) à à 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). 2021. 10. 25. Rekurzió 3 9

 5 Rekurzív típusok (folytatás) Sokaság filozófiájával aposztrofálva a rekurzív ágat: Típus TLista=Rekurzió (elem:

5 Rekurzív típusok (folytatás) Sokaság filozófiájával aposztrofálva a rekurzív ágat: Típus TLista=Rekurzió (elem: TElem köv: TLista) köv Példák: Típus TLista=Rekurzió (elem: TElem farok: TLista) Típus TBin. Fa=Rekurzió (elem: TElem bal, jobb: TBin. Fa) Típus TFa=Rekurzió (elem: TElem ágak: Sorozat(TFa)) A Sorozat csak jelzése valamely ismert sorozatfélének (Tömb, Absztrakt. Sorozat …) 2021. 10. 25. Rekurzió 3 10

 5 Rekurzív típusok (folytatás) 5. 2. 1 Rekurzió mint sokaság Sajátossága: à A

5 Rekurzív típusok (folytatás) 5. 2. 1 Rekurzió mint sokaság Sajá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 vonatkozni fog). 2021. 10. 25. Rekurzió 3 11

 5 Rekurzív típusok (folytatás) 5. 2. 1. 1 Algebrai specifikáció Az alábbiakban csak

5 Rekurzív típusok (folytatás) 5. 2. 1. 1 Algebrai specifikáció Az alábbiakban csak a legjellegzetesebb műveleteit vesszük figyelembe: Típus Rekurzió(Elem; rszel 1, …: Rek): [Megállapodás: Szel={rszel 1, …}] Asszociált műveletek: Üres: Rek Illeszt(mit, mihez, min keresztül) Üres? (Rek): Logikai Létrehoz(Elem): Rek Illeszt(Rek, Szel): Rek {Nem. Def} Leválaszt(Rek, Szel, Rek): Rek {Nem. Def} Elem(Rek): Elem {Nem. Def} Leválaszt(miről, min keresztül, mire): Rész(Rek, Szel): Rek {Nem. Def} miről’ mire’ Módosít(Rek, Elem): Rek {Nem. Def} Elsőre(Rek): Rek {Nem. Def} Következőre(Rek, Szel): Rek {Nem. Def} 2021. 10. 25. Rekurzió 3 12

 5 Rekurzív típusok (folytatás) Elején? (Rek): Logikai {Nem. Def} Végén? (Rek): Logikai {Nem.

5 Rekurzív típusok (folytatás) Elején? (Rek): Logikai {Nem. Def} Végén? (Rek): Logikai {Nem. Def} Jelölések: Jelölések r, r’, r”, rr’: Rek – általában a felső vesszők időbeliségre utalnak e: Elem s: Szel „=”: Rek Logikai, strukturális és elemérték-szintű azonosság Axiómák: 1º Üres – axióma r=Üres Üres? (r) Elem(r)=Nem. Def Elején? (r)=Nem. Def Végén? (r)=Nem. Def 2º Létrehoz – axióma r=Létrehoz(e) Üres? (r) Elején? (r) Végén? (r) Elem(r)=e Üres? (Rész(r, s)) Illeszt(mit, mihez, min keresztül) 3º Illeszt – axióma Illeszt(r, Üres, s)=r Létezik aktuális elem. Elem(r) Nem. Def Illeszt(rr, r, s)=r’ Rész(r’, s)=rr 2021. 10. 25. Rekurzió 3 13

 5 Rekurzív típusok (folytatás) Nem létezik aktuális elem. 3’º Illeszt – hiba-axióma Elem(r)=Nem.

5 Rekurzív típusok (folytatás) Nem létezik aktuális elem. 3’º Illeszt – hiba-axióma Elem(r)=Nem. Def Illeszt(rr, r, s)=Nem. Def 4º Leválaszt – axióma [r r’, rr rr’] Elem(r) Nem. Def Rész(r, s)=rs Üres? (rr) Leválaszt(r, s, rr)=(r’, rr’) rr’=rs Üres? (Rész(r’, s)) Leválaszt(miről, min keresztül, mire): 4’º Leválaszt – hiba-axióma miről’ mire’ Elem(r)=Nem. Def Üres? (rr) Leválaszt(r, s, rr)=Nem. Def 5º Módosít – axióma Elem(r) Nem. Def Módosít(r, e)=r’ Elem(r)=e 5’º Módosít – hiba-axióma Elem(r)=Nem. Def Módosít(r, e)=Nem. Def 2021. 10. 25. Rekurzió 3 14

 5 Rekurzív típusok (folytatás) 6º Elsőre-Következőre – axióma Üres? (r) Elsőre(r)=r’ Elem(r’)=e Illeszt(rr,

5 Rekurzív típusok (folytatás) 6º Elsőre-Következőre – axióma Üres? (r) Elsőre(r)=r’ Elem(r’)=e Illeszt(rr, r’, s)=r” Elem(Elsőre(r”))=e … hf: a Következőre megfogalmazása … 6’º Elsőre-Következőre – hiba-axióma Elem(r)=Nem. Def Elsőre(r)=Nem. Def Következőre(r)=Nem. Def 7º Elején? -Végén? – axióma Elem(r) Nem. Def Elején? (Elsőre(r)) Következőre(r)=r’ r’ Nem. Def Elején? (r’) … hf: a Végén? megfogalmazása 7’º Elején? -Végén? – hiba-axióma Elem(r)=Nem. Def Elején? (r)=Nem. Def Végén? (r)=Nem. Def 2021. 10. 25. Rekurzió 3 15

 5 Rekurzív típusok (folytatás) 5. 2. 1. 2 A rekurzió exportmodulja à a

5 Rekurzív típusok (folytatás) 5. 2. 1. 2 A rekurzió exportmodulja à a modulfejben tisztázni kell a felhasználás szintaxisát, de ezt most nem lehet teljesen egzakt módon, mivel változó számú paraméterrel rendelkezik. Típus TRek= Rekurzió(eszel: TElem, rszel 1, …: TRek) Export. Modul Rekurzió(eszel: TElem, rszel 1, …: TRek): Formálisabban (szintaktikus ellenőrzés lehetőségét lehetővé téve): Export. Modul Rekurzió(Konstans eszel: Szelektor, Típus TElem, Konstans rszel 1, …: Szelektor, Típus TRek): Másként Rekurzió(eszel: TElem, rszel 1, …: TRek) 2021. 10. 25. Rekurzió 3 16

 5 Rekurzív típusok (folytatás) Kísérlet az exportmodul „egzakttá” tételére: * bináris fa rekurzív

5 Rekurzív típusok (folytatás) Kísérlet az exportmodul „egzakttá” tételére: * bináris fa rekurzív típusának definiálása: Típus TBFSzel=(elem, bal, jobb) [felsorolási típus] TElem=… TBF=Rekurzió(TElem, TBFSzel) * … és exportmodulja: Export. Modul 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] Lényeg: a típuskonstrukciónál csak a minimálisan szükséges számú paraméter szerepeljen! Nem erőltetjük a rekurzivitás explicit kifejezését. 2021. 10. 25. Rekurzió 3 18

 5 Rekurzív típusok (folytatás) Most a szokásos, nem teljesen egzakt Exportmodul: jelöléssel folytatjuk.

5 Rekurzív típusok (folytatás) Most a szokásos, nem teljesen egzakt Exportmodul: jelöléssel folytatjuk. Export. Modul Rekurzió(eszel: TElem, rszel 1 …: 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. Precízebben: Eljárás Illeszt(Konstans mit: TRek, Szelektor’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] 2021. 10. 25. Rekurzió 3 19

 5 Rekurzív típusok (folytatás) Eljárás Leválaszt(Változó miről: TRek, Konstans melyik: Szelektor, Változó mire:

5 Rekurzív típusok (folytatás) 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ékmegosztá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] 2021. 10. 25. Rekurzió 3 20

 5 Rekurzív típusok (folytatás) Eljárás Felszabadít(Változó r: TRek) [Uf: felszabadítja az akt-ból eredő

5 Rekurzív típusok (folytatás) 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. 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! 2021. 10. 25. Rekurzió 3 21

 5 Rekurzív típusok (folytatás) Megvalósítási modul: Ez a típus „globális” neve is. Modul

5 Rekurzív típusok (folytatás) Megvalósítási modul: Ez a típus „globális” neve is. Modul Rekurzió(eszel: TElem, rszel 1, …: TRek): Reprezentáció [láncolt] Pascal-ban: Típus TRElem=Rekord(eszel: TElem, ^TRElem rszel 1, Ez dönt a típus me… : TRElem’Mutató) mórialefoglalásról. TRek=Rekord(gyökér: TRElem’Mutató akt: TRElem’Mutató) Változó r: TRek Implemetáció Függvény Üres? (Konstans r: TRek): Logikai Szokásos mező még: Üres? : =r. gyökér=Sehova hiba: Logikai Függvény vége. Ettől most eltekintünk. Konstans Üres: TRek(Sehova, Sehova) 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. 2021. 10. 25. Rekurzió 3 22

 5 Rekurzív típusok (folytatás) Eljárás Illeszt(Konstans mit: TRek, Változó mihez: TRek, Jól-definiáltság Konstans

5 Rekurzív típusok (folytatás) Eljárás Illeszt(Konstans mit: TRek, Változó mihez: TRek, Jól-definiáltság Konstans melyik: Szelektor): [Ef: mihez. gyökér=Sehova Hogy ne vesszen (mihez. akt Sehova melyik≠eszel el elem TRElem(mihez. akt). melyik=Sehova)] Elágazás Pascal-ban: Üres? (mihez) esetén mihez. akt^. melyik 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 …] 2021. 10. 25. Rekurzió 3 23

 5 Rekurzív típusok (folytatás) Függvény Elem(Konstans r: TRek): TElem [Ef: r. akt≠Sehova] Elem:

5 Rekurzív típusok (folytatás) 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]) 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. 2021. 10. 25. Rekurzió 3 24

 5 Rekurzív típusok (folytatás) Eljárás Elsőre(Változó r: TRek): [Ef: r. akt≠Sehova r. gyökér≠Sehova]

5 Rekurzív típusok (folytatás) 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). melyik Sehova] 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: =Üres Modul vége. 2021. 10. 25. Rekurzió 3 25

 5 Rekurzív típusok (folytatás) Példaként egy érték megkeresése a TRek típuskonstrukció műveleteire építve:

5 Rekurzív típusok (folytatás) Példaként egy érték megkeresése a TRek típuskonstrukció műveleteire építve: Függvény Rek. Ker(Konstans r: TRek, e: TElem): TRek [Ef: Elején? (r) Uf: e r Elem(Rek. Ker(r, e))=e Elején? (Rek. Ker(r, e)) e r Üres? (Rek. Ker(r, e))] Változó melyik: Szelektor’TRek kész: Logikai rm: TRek Ha Üres? (r) akkor Rek. Ker: =Üres különben … 2021. 10. 25. Rekurzió 3 26

 5 Rekurzív típusok (folytatás) … A nem rekurzív különben mező szelektora. Ha Elem(r)=e

5 Rekurzív típusok (folytatás) … A nem rekurzív különben mező szelektora. Ha Elem(r)=e akkor Rek. Ker: =r különben melyik: =Következő(Min’Szelektor’TRek) kész: =Hamis Ciklus amíg melyik Max’Szelektor’TRek és nem kész rm: =Rek. Ker(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 Rek. Ker: =rm Elágazás vége Függvény vége. 2021. 10. 25. Rekurzió 3 27

 5 Rekurzív típusok (folytatás) Az értékmegosztás problematikájának egy példája: A bf „kétszeresen balra

5 Rekurzív típusok (folytatás) 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, bf 2) bf Rész(bf, bal) Elsőre(bf) Leválaszt(Rész(bf, bal), bal, bf 2) Rész(bf, bal), bal 2021. 10. 25. Rekurzió 3 28

 5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf

5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf 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) Elsőre(bf) 2021. 10. 25. jbf: =Rész(bf, jobb) Rekurzió 3 29

 5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf

5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf 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: =Rész(bf, bal) 2021. 10. 25. jbf Rekurzió 3 30

 5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf

5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf 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) jÉrt: =Feldolgozás(jbf); jbf bÉrt: =Feldolgozás(bf) 2021. 10. 25. Rekurzió 3 31

 5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf

5 Rekurzív típusok (folytatás) A helyfelszabadítás és az értékmegosztás problematikájának egy példája: bf 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) ? 2021. 10. 25. 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? Rekurzió 3 32

 5 Rekurzív típusok (folytatás) Egy tisztességes megoldás ötlete: • • Hivatkozás- („tulajdonos”-) számlálás.

5 Rekurzív típusok (folytatás) 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. 2. • • 2021. 10. 25. Reprezentáció-módosítás minden rekurzív elemnek tulajdonos-számlálót Implementáció-módosítás (hol kell a számlálóval foglalkozni? ) Tartós értékmegosztás történik: Értékadáskor Eljáráshíváskor Csak időleges a paraméterek vonatkozásában értékmegosztás Függvényhíváskor történik: a paraméterek, fv. -érték vonatkozásában (=nem kell) Kifejezésekben Rekurzió 3 33

 5 Rekurzív típusok (folytatás) Érdemes a részleteket meggondolni Pl. a b: =fv(bb) értékadást

5 Rekurzív típusok (folytatás) Érdemes a részleteket meggondolni Pl. 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): Tulajdonost. Csökkent(b)[b-től kiindulva az összes elem tulajdonosszámlálóját 1 -gyel csökkenti, és a 0 tulajdonos-számúak helyét felszabadítja] b: =bb [címmegosztás] Tulajdonost. Növel(b) [b-től kiindulva az összes elem tulajdonos- számlálóját 1 -gyel növeli] Eljárás vége. 2021. 10. 25. Rekurzió 3 34

 5 Rekurzív típusok (folytatás) Az algebrai 5. 2. 2 Rekurzió mint rekord-analogon specifikáció:

5 Rekurzív típusok (folytatás) Az algebrai 5. 2. 2 Rekurzió mint rekord-analogon specifikáció: hf. Előzetes megjegyzések: à ez az „igazi”, rekurzióhoz illeszkedő elképzelés à a leírás nem teljesen „egzakt” formális okok miatt Export. Modul Rekurzió(eszel: TElem, rszel 1, …: TRek): Függvény Üres? (Konstans r: TRek): Logikai Konstans Üres: TRek Operátor Mező(Konstans r: TRek, melyik: Szelektor): TElem TRek Másnéven r. melyik [Ef: melyik=eszel melyik=rszel 1 … Uf: az r melyik szelektora által kijelölt komponense, amely ha melyik=eszel, akkor TElem, ha melyik=rszeli, akkor TRek típusú] 2021. 10. 25. Rekurzió 3 35

 5 Rekurzív típusok (folytatás) Operátor Legyen(Változó r: TRek, Konstans melyik: Szelektor, er: TElem

5 Rekurzív típusok (folytatás) 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. Következmény: à Nincs szükség néhány korábbi műveletre. Pl. : Elem, Rész, Következőre… Hf: megoldani az új jelölésekkel. à Nem megvalósítható az Elsőre. 2021. 10. 25. Rekurzió 3 36

 5 Rekurzív típusok (folytatás) Egy „szintaktikai” példa: Típus TBin. Fa=Rekurzió(ért: TElem, bal, jobb:

5 Rekurzív típusok (folytatás) Egy „szintaktikai” példa: Típus TBin. Fa=Rekurzió(ért: TElem, bal, jobb: TBin. Fa) Változó b 1, b 2: TBin. Fa e: TElem b 1: =Üres; b 2: =TBin. Fa(e, Üres, b 1) [egy-elemű bifa] … e: =b 2. ért; b 1: =b 2. bal [a binfa részeihez férés] … b 1. ért: =e; b 1. bal: =b 2. jobb [binfa részek módosítása] … b 2: =TBin. Fa(b 1. ért, b 1. jobb, b 1. bal) [binfa-komponálás] 2021. 10. 25. Rekurzió 3 37

 5 Rekurzív típusok (folytatás) Vö. : a sokaság-szerűvel! Modul Rekurzió(eszel: TElem, rszel 1,

5 Rekurzív típusok (folytatás) Vö. : a sokaság-szerűvel! Modul Rekurzió(eszel: TElem, rszel 1, …: TRek): Reprezentáció Típus TRElem=Rekord(eszel: TElem rszel 1, …: 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 TRek Másnéven r. melyik Mező: =TRElem(r). melyik Operátor Vége. 2021. 10. 25. Rekurzió 3 38

 5 Rekurzív típusok (folytatás) Operátor Legyen(Változó r: TRek, Konstans melyik: Szelektor, er: TElem

5 Rekurzív típusok (folytatás) Operátor Legyen(Változó r: TRek, Konstans melyik: Szelektor, er: TElem TRek) Másnéven r. melyik: =er TRElem(r). melyik: =er Operátor Vége. Inicializálás r: =Üres Modul vége. Megjegyzés: ez esetben is választható az „intelligens”, tulajdonos-számlálós implementáció, amely a TRek-típusú értékadások intelligens megvalósítását jelenti 2021. 10. 25. Rekurzió 3 39

 5 Rekurzív típusok (folytatás) 5. 3 Struktúrabejárás mint a feldolgozás kerete • Feldolgozás

5 Rekurzív típusok (folytatás) 5. 3 Struktúrabejárás mint a feldolgozás kerete • Feldolgozás sokaság-szemlélettel: Eljárás RFeld(Konstans r: TRek): Ha nem Üres? (r) akkor EFeld(Elem(r)) RFeld(Rész(r, rszel 1)) RFeld(Rész(r, rszel 2)) … Elágazás vége Eljárás vége. • Feldolgozás rekord-szemlélettel: Eljárás RFeld(Konstans r: TRek): Ha nem Üres? (r) akkor EFeld(r. eszel) RFeld(r. rszel 1) RFeld(r. rszel 2) … Elágazás vége Eljárás vége. 2021. 10. 25. Rekurzió 3 40

 5 Rekurzív típusok (folytatás) Példák: • Listabejárás: Lehet tetszőleges elem-feldolgozás. Eljárás LBejár(Konstans l:

5 Rekurzív típusok (folytatás) Példák: • Listabejárás: Lehet tetszőleges elem-feldolgozá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. Hívása: Elsőre(l); LBejár(l) 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. Hívása: LBejár(l) 2021. 10. 25. Rekurzió 3 Elhagyható lenne! 41

 5 Rekurzív típusok (folytatás) az algoritmikus rekurzió iterációvá alakítása egyszerű a jobbrekurzió miatt:

5 Rekurzív típusok (folytatás) az algoritmikus rekurzió iterációvá alakítása egyszerű a jobbrekurzió miatt: Eljárás LBejár(Konstans l: TLista): Változó sl: TLista sl: =l; Elsőre(sl) Végén? (sl) Ciklus amíg nem Üres? (sl) Ki: Elem(l) sl: =Rész(sl, farok) sl: =Következőre(sl, farok) Ciklus vége Eljá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ége Eljárás vége. 2021. 10. 25. Rekurzió 3 42