Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaKaja Helle Megváltozta több, mint 5 éve
1
Rekurzió 1. Szlávi Péter ELTE Informatika Szakmódszertani Csoport
2000
2
Tartalom 0 Bevezetés 1 Rekurzív specifikáció
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? Rekurzió 1
3
Tartalom 4 Rekurzió és iteráció 5 Rekurzív típusok
4.1 Oda 4.2 Vissza 5 Rekurzív típusok 5.1 Nevezetes rekurzív adatszerkezetek 5.2 Rekurzív adatszerkezetek megadása 5.3 A struktúrabejárás mint a feldolgozás „kerete” 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 Rekurzió 1
4
0 Bevezetés 0.1 A rekurzió lényege; „klasszikus” példák
Lényeg: „önhivatkozás” Például: Közismert hatékonysági gondok: lassúság nagy helyfoglalás „Klasszikusok”: faktoriális számok Fibonacci-számok* Előzetes magyarázat: a rekurzió „szervezkedési” többlet- tevékenysége (vermelések) Rekurzió 1
5
0 Bevezetés (folytatás)
Ackermann-függvény* : Elvadultságáról: Ack(0,m)=m+1 • Ack(1,m)=m+2 Ack(2,m)=2*m+3 • Ack(3,m)=2m+3-3 Ack(4,m)= 2 -3, ahol az a 2-t m+2-ször tartalmazza kitevőként. Binomiális számok: Rekurzió 1
6
0 Bevezetés (folytatás)
Quick sort rendezés : Rekurzió 1
7
0 Bevezetés (folytatás)
Koch fraktál : Rekurzió 1
8
0 Bevezetés (folytatás)
Hanoi tornyai : Rekurzió 1
9
0 Bevezetés (folytatás)
0 Bevezetés (folytatás) 0.2 A rekurzió helye a programkészítés folyamatában: Rekurzív specifikáció Nem rekurzív specifikáció Rekurzív algoritmus Nem rekurzív algoritmus Rekurzív programkód Nem rekurzív programkód Számítógép Számítógép Megjegyzés: a rekurzió elvont értelemben általánosabb eszköz, mint az ite- ráció. [L. McCarthy tétele, Paterson-Hewitt tétele a Manna: „Programo- zás elmélet” c. könyvben.] McCarthy tétele: Minden folyamatábra-séma áttranszformálható vele ekvivalens rekurzív sémává. Paterson-Hewitt tétele: Nincs olyan folyamatábra-séma (akárhány programváltozót is engedünk meg), amely ekvivalens lenne az alábbi rekurzív sémával: SA:=F(a), ahol F(y):=If p(y) then f(y) else h(F(g1(y), F(g2(y)). Rekurzió 1 Rekurzió 1
10
1 Rekurzív specifikáció
1.1 Formalizmus(ról egy példán keresztül) Be: NN, XH* … Ki: Y … Ef: N=Hossz(X) ... Uf: Y=RekFv(X,N) Def: RekFv(x,n): H* N H* f(x,n) , ha T(x,n) RekFv(x,n) := g(RekFv(x,n-1)) , egyébként Megállapodások: 1. Általában csak az utófeltételbeli definíciót adjuk meg a továbbiakban. Nem rekurzív ág(ak) Rekurzív ág(ak) Rekurzió 1
11
1 Rekurzív specifikáció (folytatás)
1 Rekurzív specifikáció (folytatás) 2. Az alábbi konstansok, függvények és operátorok de- finíció nélkül fölhasználhatók a rekurzív függvény definiálásakor: ( _ ) – Üres sorozat Xi – az X sorozat i. eleme Hossz:H*N, Hossz((s1,…,sN)):=N Végére:HH*H*, Végére(x,(s1,…,sN)):=(s1,…,sN,x) Eleje:H*NH*, Eleje((s1,…,sN),i):=(s1,…,si) Rekurzió 1 Rekurzió 1
12
1 Rekurzív specifikáció (folytatás)
1.2 Példák Sorozatszámítás tétel Eldöntés tétel Kiválasztás tétel Keresés tétel Rekurzió 1
13
1 Rekurzív specifikáció (folytatás)
1 Rekurzív specifikáció (folytatás) Megszámolás tétel Maximumkiválasztás tétel Másolás tétel Kiválogatás tétel Hf: maximumérték kiválasztás Rekurzió 1 Rekurzió 1
14
1 Rekurzív specifikáció (folytatás)
Megcseréli az X Maximum(X,n)-edik és n-edik elemét. Hf Rendezés maximumkiválasztással Figyelem: itt az n a sorozat még rendezendő részének utolsó elemének indexét jelöli; s csak kezdetben igaz: n=Hossz(X) Szétválogatás tétel Quick sort: hf L. előbb Rekurzió 1
15
2 Rekurzív specifikáció és algoritmus
Általánosságok: ...emlékeztető a struktúra szerinti feldolgozás elvére, és alkalmazása a függvények világában… Példák: Fibonacci-számok: Függvény Fib(Konstans N:Egész):Egész Elágazás N=0 esetén Fib:= N=1 esetén Fib:=1 egyéb esetben Fib:=Fib(N-1)+Fib(N-2) Elágazás vége Függvény vége. Rekurzió 1
16
2 Rekurzív specifikáció és algoritmus (folytatás)
Ackermann-függvény: Függvény Ack(Konstans N,M:Egész):Egész Elágazás N=0 esetén Ack:=M+1 N>0 és M=0 esetén Ack:=Ack(N-1,1) egyéb esetben Ack:=Ack(N-1,Ack(N,M-1)) Elágazás vége Függvény vége. Rekurzió 1
17
2 Rekurzív specifikáció és algoritmus (folytatás)
Binomiális számok: Függvény B(Konstans N,K:Egész):Egész Ha K=0 vagy K=N akkor B:=1 különben B:=B(N-1,K)+B(N-1,K-1) Elágazás vége Függvény vége. A másik definíciójú algoritmus: hf. Rekurzió 1
18
2 Rekurzív specifikáció és algoritmus (folytatás)
„Quick sort” rendezés: Meggondolandó: 1. a paraméterek eltérő hozzáférési joga; 2. a „Szétválogatás” eljárás; 3. milyen szélsőséges helyzetek adódnak hatékonyság szempontjából. Eljárás Quick(Változó A:TSorozat, Konstans E,V:Egész): [E,V az A “rendezendő” rész eleje,vége] Szétválogat(A,E,V,K) Ha K-E>1 akkor Quick(A,E,K-1) Ha V-K>1 akkor Quick(A,K+1,V) Eljárás vége. Rekurzió 1
19
3 Rekurzió megvalósítása nem rekurzív környezetben
3.1 Problémák „Állatorvosi ló (-: csacsi :-)” – a faktoriális függvény Tételezzük föl, hogy a „környezet” képes az eljárá- sok többszörös (értsd: egymásba ágyazott) hívásának le- kezelésére. (Visszatérési cím a verembe; aktuális és formális paraméterek összekapcsolása.) Függvény Fakt(Konstans N:Egész):Egész Változó f:Egész Ha N=0 akkor f:= különben f:=N*Fakt(N-1) Fakt:=f Függvény vége. Rekurzió 1
20
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
Milyen problémákkal szembesül a fordítóprogram, hogy a függvény végrehajtható legyen bármely N-re. Pl. ?Fakt(2)? Fakt(2)= 2N [Ha N=0 akkor … különben] f:=N* ?Fakt(N-1)? Fakt:=f Fakt(2)= 2N [Ha 2=0 akkor … különben] f:=2* ?Fakt(2-1)? Fakt:=f Fakt(2)= 2N [Ha 2=0 akkor … különben] f:=2* 1 Fakt:=2 Fakt(1)= 1N [Ha 1=0 akkor … különben] f:=1* 1 Fakt:=1 Fakt(1)= 1N [Ha 1=0 akkor … különben] f:=1* ?Fakt(1-1)? Fakt:=f Fakt(1)= 1N [Ha N=0 akkor … különben] f:=N* ?Fakt(N-1)? Fakt:=f Fakt(0)= 0N [Ha N=0 akkor] f:=1 Fakt:=f Fakt(0)= 0N [Ha 0=0 akkor] f:=1 Fakt:=1 Rekurzió 1
21
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
Összefoglalva a problémákat: A bemenő paraméter problematikája. Hogyan kerül a bemenő érték ugyanazzal a kóddal megvalósított eljáráshoz, azaz a rekurzívan újból a hí- votthoz? A függvényeljárások értékvisszaadása. Hogyan kerül a (rekurzívan) hívott függvény értéke a hívó eljárásban „felszínre”? A lokális változók egyedisége. Rekurzió 1
22
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
A megoldás vázlata: 1. és 3. probléma – belépéskor vermelés, kilépéskor ve- remből kivétel. 2. probléma (nem csak rekurziónál) – az érték verembe tétele közvetlenül a visszatérés előtt. A függvényt eljárássá alakítva (s az értékét verembe téve). Pl. Eljárás Fakt(Konstans N:Egész): Verembe(N) [paraméter a verembe] Ha N=0 akkor Fakt:=1 különben Fakt(N-1) [„függvény”-hívás] Veremből(f) [Fakt(N-1) értékef] N:=VeremTető [az aktuális N] Fakt:=N*f [a függvényérték] Elágazás vége Veremből(N) [paraméter a veremből] Verembe(Fakt) [függvényérték a verembe] Eljárás vége. Csak az értékhez férés a cél. Rekurzió 1
23
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás) Fibonacci-számok: Eljárás Fib(Konstans N:Egész): Verembe(N) [paraméter a verembe] Elágazás N=0 esetén Fib:=0 N=1 esetén Fib:=1 egyéb esetben Fib(N-1); Veremből(f1) [1. részeredményf1] N:=VeremTető [paraméter a veremből] Verembe(f1) [„lokális” változó a verembe] Fib(N-2); Veremből(f2) [2. részeredményf2] Veremből(f1) [„lokális” változó a veremből] Fib:=f1+f2 [a függvényérték kiszámítása] Elágazás vége Veremből(N) [paraméter a veremből] Verembe(Fib) [függvényérték a verembe] Eljárás vége. Szándékosan nem jelöltük „lokális” változóként, hiszen éppen az ilyenek kezelését kell megoldanunk. Csak az értékhez férés a cél. Ad „Csak az értékhez férés a cél” megjegyzés: a ha van jobb módszer, pl. direkt címhozzáférés, az is jó, sőt… Rekurzió 1 Rekurzió 1
24
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás) Binomiális számok: Eljárás B(Konstans N,K:Egész): Verembe(N,K) Ha K=0 vagy K=N akkor B:=1 különben B(N-1,K); Veremből(b1) Veremből(K,N); Verembe(N,K) Verembe(b1) B(N-1,K-1) Veremből(b2); Veremből(b1) B:=b1+b2 Elágazás vége Veremből(K,N) Verembe(B) [függvényérték a verembe] Eljárás vége. Csak az értékhez férés a cél. Csak az N és a K értékéhez férés a cél. Ad „Csak az N és K értékéhez férés a cél” megjegyzés: a ha van jobb módszer, pl. direkt címhozzáférés, az is jó, sőt… Itt nem használható –érdemben- a VeremTető, mivel úgyis alá kellene látni; azaz a dupla Veremből helyett egy Veremből és egy VeremTető kellene (igaz, elegendő lenne egyetlen „szimpla” Verembe is). Rekurzió 1 Rekurzió 1
25
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
3.3 A valódi megoldás ötlete, avagy mit tesz egy fordítóprogram? A paraméterek számára a verembe helyet foglaló kódrészt generál. Pl. Eljárás QS(Változó x:T; Konstans e,v:Egész;Változó k:Egész) esetén a QS(t,a,b,c) híváskor ilyesfélét: Verembe(Cím(t)) [Típustól függetlenül!] Verembe(a); Verembe(b); Verembe(Cím(c)) Aktuális paraméterek Formális paraméterek Rekurzió 1
26
3 Rekurzió megvalósítása nem rekurzív környezetben (folytatás)
Az eljárástörzsben pedig a verem aktuális tetejéhez képesti relatív című hivatkozásokkal. Pl. Cím(x)=VeremTartalom(SP-|Cím(k)|-|v|-|e|-|Cím(x)|) Cím(e)=SP-|Cím(k)|-|v|-|e| [bár a címe nem érhető el!] e=VeremTartalom(SP-|Cím(k)|-|v|-|e|) ... ahol a VeremTartalom annyi byte-nyi és olyan típusú érté- ket jelent, amely az adott adathoz tartozik; a |x| az x típusának megfelelő byte-szám. Pl. e=VeremTartalom(SP-|Cím(k)|-|v|-|e|) 2 byte-os egész számot jelent, hiszen e:Egész Ugyanezeket kell megtenni a lokális adatokkal is. Rekurzió 1
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.