Rekurzi 3 Szlvi Pter ELTE Informatika Szakmdszertani Csoport
- Slides: 41
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 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 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 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, 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 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 á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ó 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. 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: 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 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 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. 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. 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, 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 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 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. 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: 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ő 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 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 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: =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] 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: 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 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 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 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 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 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 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. 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 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ó: 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 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: 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, …: 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 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 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: 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: 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
- Dermografismo tem cura
- Csoportmunka előnyei
- Hacek csoport
- Alkohol funkciós csoport
- Csoport alakulásának fázisai
- észterek csoportosítása
- Telekommunikációs hálózatok elte
- Elte ttk to
- Caesar elte
- Elte gtk
- Branyi elte
- Elte ttk matematika
- Seas elte
- Arató miklós elte
- Objektumelvű programozás elte
- Kő papír olló ceruza faragó
- árva gábor
- Hkr elte
- Moodle elte
- Elte ttk tanulmányi ösztöndíj
- Elte ik könyvtár
- Elte ik abszolutórium
- Elte zh időpontok
- Elte kredittúllépés
- Elte matematika bsc tantervi háló
- Elte ik doktori iskola
- Vadász péter elte ik
- Seas library
- Szendrei rudolf
- Elte ttk szakdolgozat
- Www.canvas.elte
- Fajlagos töltés
- Algoritmusok és adatszerkezetek elte
- Dorner helga
- Progalap elte
- Horváth ákos elte
- Elte merkur
- Ppk elte
- Illés zoltán elte
- Elte budapest szakok
- Levélgyűjtő szekrény kereső
- Html alapok