rekurzió - eltealgtan1.elte.hu/downloads/eloadas/rekurzio2.pdf2 2020. 11. 09. rekurzió és...
TRANSCRIPT
-
Rekurzió
(Horváth Gyula és Szlávi Péter előadásai
felhasználásával)
-
22020. 11. 09.
Rekurzió és iteráció
BalrekurzióHa az eljárás első utasításaként szerepel a rekurzív hívás, akkor
a rekurzió lényegében az első nem rekurzívan számolható érték
megkeresését szervezi. Majd a visszatérés(ek) után végzi el a
transzformációt. Vagyis fordított sorrendű földolgozást végez.
Általános sémája:
R(x,y):
Ha p(x,y) akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 2/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
32020. 11. 09.
Rekurzió és iteráció
Balrekurzió – példák a feldolgozandóra
a sorozat elemei egy soros állomány rekordjai,
a sorozat elemeit láncolt ábrázolással tároljuk és az aktuális elemtől csak a következőt lehet elérni, az előzőt nem,
a sorozat elemeit egy sor- vagy veremstruktúrában tároljuk,
a sorozat elemeit mindig az előző elemből számítjuk, s a sorozat előre meg nem állapítható tagjától visszafelé kell kiírni az elemeket,
nyelvünk csak olyan szövegkezelő függvényeket ismer, amelyek a szöveg első karakterét tudják megadni, illetve az első elhagyásával keletkezett részt.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 3/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
42020. 11. 09.
Rekurzió és iteráció
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 4/31
R(x,y):
Ha p(x,y)
akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
52020. 11. 09.
Rekurzió és iteráció
Balrekurzió általános átírása
Ha feltehetjük, hogy az f függvénynek létezik inverze:
R(x,y):
N:=0
Ciklus amíg p(x,y)
x:=f(x); N:=N+1
Ciklus vége
T(x,y)
Ciklus i=1-től N-ig
x:=f-1(x); S(x,y)
Ciklus vége
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 5/31
R(x,y):
Ha p(x,y)
akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
62020. 11. 09.
Rekurzió és iteráció
Balrekurzió általános átírása
Ha az f függvénynek nem létezik inverze:
R(x,y):
N:=0
Ciklus amíg p(x,y)
Verembe(x); x:=f(x); N:=N+1
Ciklus vége
T(x,y)
Ciklus i=1-től N-ig
Veremből(x); S(x,y)
Ciklus vége
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 6/31
R(x,y):
Ha p(x,y)
akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
72020. 11. 09.
Rekurzió és iteráció
Balrekurzió példa
Egy szó „tükrözve” kiírása, azaz betűi sorrendje megfordítása:
Tükröz(szó):
Ha nem üres?(szó) akkor Tükröz(elsőutániak(szó))
Ki: első(szó)
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 7/31
R(x,y):
Ha p(x,y)
akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
82020. 11. 09.
Rekurzió és iteráció
Balrekurzió példa
Egy szó „tükrözve” kiírása, azaz betűi sorrendje megfordítása:
Tükröz(szó):
N:=0
Ciklus amíg nem üres?(szó)
Verembe(első(szó)); N:=N+1
szó:=elsőutániak(szó)
Ciklus vége
Ciklus i=1-től N-ig
Veremből(B); Ki: B
Ciklus vége
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 8/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
92020. 11. 09.
Rekurzió és iteráció
Balrekurzió példa
M-nél kisebb 2-hatványok visszafelé:
Hatványok(K,M):
Ha KM akkor Hatványok(2*K,M); Ki: K
Eljárás vége.
Hatványok(K,M):
N:=0
Ciklus amíg KMK:=2*K; N:=N+1
Ciklus vége
Ciklus i=1-től N-ig
K:=K/2; Ki: K
Ciklus vége
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 9/31
R(x,y):
Ha p(x,y)
akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Rekurzió és iteráció
Balrekurzió példa
Az inverz függvényt sokszor mi alkotjuk meg:
Eljárás Valami(K,M):
Ha KM akkor Valami(köv(K),M); Ki: K
Eljárás vége.
Eljárás Valami(K,M):
N:=0
Ciklus amíg KMhonnan(köv(K)):=K
K:=köv(K); N:=+1
Ciklus vége
Ciklus i=1-től N-ig
K:=honnan(K); Ki: K
Ciklus vége
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 10/31
R(x,y):
Ha p(x,y)
akkor R(f(x),y); S(x,y)
különben T(x,y)
Eljárás vége.
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Iteráció és rekurzió
Problémák a ciklussal:
Vannak programozási nyelvek, ahol nincs ciklus, csak
rekurzió.
Nem mindig hatékony egy rekurzívan definiált függvény
összes értékét kiszámolni.
Az alábbi példában Rek(999999) kiszámításához rekurzívan
csak 2 belső eljáráshívás kell, nemrekurzívan pedig 999999
értéket számíthatnánk ki:
1000)1000mod(Re)1000(Re
1000)(:)(Re
NhaNkdivNk
NhaNfNk
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 11/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Iteráció és rekurzió
Elöltesztelős ciklus átírása
Eljárás R(x):
Ciklus amíg p(x)
T(x)
Ciklus vége
Eljárás vége.
Eljárás R(x):
Ha p(x) akkor T(x); R(x)
Eljárás vége.
Azaz az átírás eredménye egy jobbrekurzió.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 12/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Iteráció és rekurzió
Hátultesztelős ciklus átírása
Eljárás R(x):
Ciklus
S(x)
amíg p(x)
Ciklus vége
Eljárás vége.
Eljárás R(x):
S(x)
Ha p(x) akkor R(x)
Eljárás vége.
Azaz az átírás eredménye egy jobbrekurzió.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 13/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Iteráció és rekurzió
Számlálós ciklus átírása
Eljárás R(x):
Ciklus i=1-től N-ig
S(x,i)
Ciklus vége
Eljárás vége.
Először írjuk át elöltesztelősre!
Eljárás R(x):
i:=1
Ciklus amíg iN
S(x,i); i:=i+1
Ciklus vége
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 14/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Iteráció és rekurzió
Számlálós ciklus átírása
Erre már van átírási szabályunk:
Eljárás R(x):
i:=1; RR(x,i) {lehetne RR(x,1)}
Eljárás vége.
Eljárás RR(x,i):
Ha iN akkor S(x,i); i:=i+1; RR(x,i)
Eljárás vége.
Egyszerűbb az i növelése paraméterátadásnál:
Eljárás RR(x,i):
Ha iN akkor S(x,i); RR(x,i+1)
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 15/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Ciklus és rekurzió
Megadtuk a ciklusok átírási szabályait, amivel minden ciklust
alkalmazó program átírható rekurzívra. Ez az algoritmusok
átírási szabályain alapult.
Lehetséges másik út is: a nemrekurzív specifikációt írjuk át
rekurzívra, majd abból készítsünk rekurzív algoritmust!
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 16/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Sorozatszámítás
Bemenet: NN, XHN, F:HNHKimenet: SHElőfeltétel: –
Utófeltétel: S=F(X1,…XN)
Definíció:
0,,...,
0,...,
11
0
1 NhaXXXFf
NhaFXXF
NN
N
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 17/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Sorozatszámítás
F(N,X):
Ha N=0 akkor F:=F0
különben F:=f(F(N-1,X),X(N))
Függvény vége.
0,,...,
0,...,
11
0
1 NhaXXXFf
NhaFXXF
NN
N
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 18/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Eldöntés
Bemenet: NN, XHN, T:HLKimenet: VanLElőfeltétel: –
Utófeltétel: Van=eldönt(X1,…XN)
Definíció:
egyébkéntXXeldönt
XThaigazNhahamis
XXeldönt
N
NN
11
1
,...,
0,...,
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 19/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Eldöntés
eldönt(N,X):
Ha N=0 akkor eldönt:=hamis
különben ha T(X(N)) akkor eldönt:=igaz
különben eldönt:=eldönt(N-1,X)
Függvény vége.
egyébkéntXXeldönt
XThaigazNhahamis
XXeldönt
N
NN
11
1
,...,
0,...,
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 20/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Kiválasztás
Bemenet: NN, XHN, T:HLKimenet: SNElőfeltétel: i (1iN): T(Xi)
Utófeltétel: S=kiválaszt(X1,…XN)
Definíció:
egyébkéntXXkiválaszt
XThaNXXkiválaszt
N
N
N
11
1 ,...,,...,
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 21/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Kiválasztás
kiválaszt(N,X):
Ha T(X(N)) akkor kiválaszt:=N
különben kiválaszt:=kiválaszt(N-1,X)
Függvény vége.
Megjegyzés: Ez a megoldás az utolsó T tulajdonságú elemet
adja meg.
egyébkéntXXkiválaszt
XThaNXXkiválaszt
N
N
N
11
1 ,...,,...,
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 22/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Keresés
Bemenet: NN, XHN, T:HLKimenet: VanL, SNElőfeltétel: –
Utófeltétel: (Van,S)=keres(X1,…XN)
Definíció:
egyébkéntXX
XThaNigaz
Nhahamis
XX
N
NN
11
1
,...,keres
),(
0),(
,...,keres
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 23/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Kereséskeres(N,X):
Ha N=0 akkor keres:=(hamis,-)
különben ha T(X(N)) akkor keres:=(igaz,N)
különben keres:=keres(N-1,X)
Függvény vége.
keres(N,X,Van,S):
Ha N=0 akkor Van:=hamis
különben ha T(X(N)) akkor Van:=igaz; S:=N
különben keres(N-1,X,Van,S)
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 24/31
egyébkéntXX
XThaNigaz
Nhahamis
XX
N
NN
11
1
,...,keres
),(
0),(
,...,keres
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Megszámolás
Bemenet: NN, XHN, T:HLKimenet: DbNElőfeltétel: –
Utófeltétel: Db=számol(X1,…XN)
Definíció:
egyébkéntXXzámol
XThaXXzámolNha
XXzámol
N
NNN
11
111
,...,s
1,...,s00
,...,s
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 25/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Megszámolás
számol(N,X):
Ha N=0 akkor számol:=0
különben ha T(X(N))
akkor számol:=számol(N-1,X)+1
különben számol:=számol(N-1,X)
Függvény vége.
egyébkéntXXzámol
XThaXXzámolNha
XXzámol
N
NNN
11
111
,...,s
1,...,s00
,...,s
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 26/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Maximumkiválasztás
Bemenet: NN, XHN
Kimenet: MaxNElőfeltétel: N>0
Utófeltétel: Max=maximum(X1,…XN)
Definíció:
egyébkéntXX
XXXXhaN
Nha
XX
N
NNN
11
111
,...,maximum
,...,maximum
11
,...,maximum
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 27/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívanMaximumkiválasztásmaximum(N,X):
Ha N=1 akkor maximum:=N
különben Ha X(N)>X(maximum(N-1,X))
akkor maximum:=N
különben maximum:=maximum(N-1,X)
Függvény vége.
maximum(N,X):
Ha N=1 akkor maximum:=N
különben M:=maximum(N-1,X)
Ha X(N)>X(M) akkor maximum:=N
különben maximum:=M
Függvény vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 28/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívan
Kiválogatás
Bemenet: NN, XHN, T:HLKimenet: DbN, YNN
Előfeltétel: –
Utófeltétel: (Db,Y)=válogat(X1,…XN)
Definíció:
egyébkéntXX
XThaNXX
Nha
XX
N
NNN
11
111
,...,válogat
),1(,...,válogat
0),0(
,...,válogat
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 29/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Programozási tételek
rekurzívanKiválogatásválogat(N,X):
Ha N=0 akkor válogat:=(0,-)
különben ha T(X(N))
akkor válogat:=válogat(N-1,X)(1,N)
különben válogat:=válogat(N-1,X)
Függvény vége.
Válogat(N,X,Db,Y):
Ha N=0 akkor Db:=0
különben Válogat(N-1,X,Db,Y)
Ha T(X(N)) akkor Db:=Db+1; Y(Db):=N
Eljárás vége.
2020. 11. 09. 9:56 Zsakó László:: Rekurzió 30/31
http://ikportal.inf.elte.hu:8080/ELTEInformatikaiKar/elte_ik_2.html
-
Rekurzió előadás vége