Rekurzió (Horváth Gyula és Szlávi Péter előadásai felhasználásával)
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) 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 2/3 2
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. 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 3/3 3
Rekurzió és iteráció 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 4/3 4
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): :=0 Ciklus amíg p(x,y) x:=f(x); :=+ Ciklus vége T(x,y) Ciklus I=-től -ig x:=f - (x); S(x,y) Ciklus vége 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 5/3 5
Rekurzió és iteráció Balrekurzió általános átírása Ha az f függvénynek nem létezik inverze: R(x,y): :=0 Ciklus amíg p(x,y) Verembe(x); x:=f(x); :=+ Ciklus vége T(x,y) Ciklus i=-től -ig Veremből(x); S(x,y) Ciklus vége 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 6/3 6
Balrekurzió példa Rekurzió és iteráció 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ó) 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 7/3 7
Balrekurzió példa Rekurzió és iteráció Egy szó tükrözve kiírása, azaz betűi sorrendje megfordítása: Tükröz(szó): :=0 Ciklus amíg nem üres?(szó) Verembe(első(szó)); :=+ szó:=elsőutániak(szó) Ciklus vége Ciklus i=-től -ig Veremből(B); Ki: B Ciklus vége 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 8/3 8
Balrekurzió példa Rekurzió és iteráció M-nél kisebb 2-hatványok visszafelé: Hatványok(K,M): Ha KM akkor Hatványok(2*K,M); Ki: K Hatványok(K,M): :=0 Ciklus amíg KM K:=2*K; :=+ Ciklus vége Ciklus I=-től -ig K:=K/2; Ki: K Ciklus vége 208. 0. 8. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 9/3 9
Balrekurzió példa Rekurzió és iteráció 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 Valami(K,M): :=0 Ciklus amíg KM honnan(köv(k)):=k K:=köv(K); :=+ Ciklus vége Ciklus i=-től -ig K:=honnan(K); Ki: K Ciklus vége 208. 0. 8. 8:6 Zsakó László:: Rekurzió 0/3
Problémák a ciklussal: Iteráció és rekurzió Vannak programozási nyelvek, ahol nincs ciklus, csak rekurzió. em 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: Re k( ) : Re k( f ( ) div 000) Re k( mod 000) ha ha 000 000 208. 0. 8. 8:6 Zsakó László:: Rekurzió /3
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 R(x): Ha p(x) akkor T(x); R(x) Iteráció és rekurzió Azaz az átírás eredménye egy jobbrekurzió. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 2/3
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 R(x): S(x) Ha p(x) akkor R(x) Azaz az átírás eredménye egy jobbrekurzió. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 3/3
Számlálós ciklus átírása Eljárás R(x): Ciklus i=-től -ig S(x,i) Ciklus vége Először írjuk át elöltesztelősre! Eljárás R(x): i:= Ciklus amíg i S(x,i); i:=i+ Ciklus vége Iteráció és rekurzió 208. 0. 8. 8:6 Zsakó László:: Rekurzió 4/3
Számlálós ciklus átírása Erre már van átírási szabályunk: Eljárás R(x): i:=; RR(x,i) Iteráció és rekurzió Eljárás RR(x,i): Ha i akkor S(x,i); i:=i+; RR(x,i) Egyszerűbb az i növelése paraméterátadásnál: Eljárás RR(x,i): Ha i akkor S(x,i); RR(x,i+) 208. 0. 8. 8:6 Zsakó László:: Rekurzió 5/3
Ciklus és rekurzió Programozási tételek rekurzívan 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! 208. 0. 8. 8:6 Zsakó László:: Rekurzió 6/3
Sorozatszámítás Programozási tételek rekurzívan Bemenet:, XH, F:H H Kimenet: SH Előfeltétel: Utófeltétel: S=F(X, X ) Definíció: F X,..., X f F 0 F X,..., X, X ha 0 ha 0 208. 0. 8. 8:6 Zsakó László:: Rekurzió 7/3
Sorozatszámítás Programozási tételek rekurzívan F(,X): Ha =0 akkor F:=F0 különben F:=f(F(-,X),X()) Függvény vége. F X,..., X f F 0 F X,..., X, X ha 0 ha 0 208. 0. 8. 8:6 Zsakó László:: Rekurzió 8/3
Eldöntés Programozási tételek rekurzívan Bemenet:, XH, T:HL Kimenet: VanL Előfeltétel: Utófeltétel: Van=eldönt(X, X ) Definíció: eldönt X,..., X igaz ha T X eldöntx,..., X hamis ha 0 egyébként 208. 0. 8. 8:6 Zsakó László:: Rekurzió 9/3
Eldöntés Programozási tételek rekurzívan eldönt X,..., X igaz ha T X eldöntx,..., X hamis ha 0 egyébként eldönt(,x): Ha =0 akkor eldönt:=hamis különben ha T(X()) akkor eldönt:=igaz különben eldönt:=eldönt(-,x) Függvény vége. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 20/3
Kiválasztás Programozási tételek rekurzívan Bemenet:, XH, T:HL Kimenet: S Előfeltétel: i (i): T(X i ) Utófeltétel: S=kiválaszt(X, X ) Definíció: kiválaszt X,..., X kiválaszt X,..., X ha T X egyébként 208. 0. 8. 8:6 Zsakó László:: Rekurzió 2/3
Kiválasztás Programozási tételek rekurzívan kiválaszt X,..., X kiválaszt X,..., X ha T X egyébként kiválaszt(,x): Ha T(X()) akkor kiválaszt:= különben kiválaszt:=kiválaszt(-,x) Függvény vége. Megjegyzés: Ez a megoldás az utolsó T tulajdonságú elemet adja meg. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 22/3
Keresés Programozási tételek rekurzívan Bemenet:, XH, T:HL Kimenet: VanL, S Előfeltétel: Utófeltétel: (Van,S)=keres(X, X ) Definíció: keres X,..., X ( igaz, ) ha T X keresx,..., X ( hamis, ) ha 0 egyébként 208. 0. 8. 8:6 Zsakó László:: Rekurzió 23/3
Programozási tételek rekurzívan Keresés keres(,x): Ha =0 akkor keres:=(hamis,-) különben ha T(X()) akkor keres:=(igaz,) különben keres:=keres(-,x) Függvény vége. keres(,x,van,s): Ha =0 akkor Van:=hamis különben ha T(X()) akkor Van:=igaz; S:= különben keres(-,x,van,s) 208. 0. 8. 8:6 Zsakó László:: Rekurzió 24/3
Megszámolás Programozási tételek rekurzívan Bemenet:, XH, T:HL Kimenet: Db Előfeltétel: Utófeltétel: Db=számol(X, X ) Definíció: számol X,..., X számolx,..., X ha T X számolx,..., X 0 ha 0 egyébként 208. 0. 8. 8:6 Zsakó László:: Rekurzió 25/3
Megszámolás Programozási tételek rekurzívan 0 ha 0 számolx,..., X számolx,..., X ha T X számolx,..., X egyébként számol(,x): Ha =0 akkor számol:=0 különben ha T(X()) akkor számol:=számol(-,x)+ különben számol:=számol(-,x) Függvény vége. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 26/3
Maximumkiválasztás Programozási tételek rekurzívan Bemenet:, XH Kimenet: Max Előfeltétel: >0 Utófeltétel: Max=maximum(X, X ) Definíció: maximum X,..., X ha X X maximum X,..., X maximum X,..., X egyébként ha 208. 0. 8. 8:6 Zsakó László:: Rekurzió 27/3
Programozási tételek rekurzívan Maximumkiválasztás maximum(,x): Ha = akkor maximum:= különben Ha X()>X(maximum(-,X)) akkor maximum:= különben maximum:=maximum(-,x) Függvény vége. maximum(,x): Ha = akkor maximum:= különben M:=maximum(-,X) Ha X()>X(M) akkor maximum:= különben maximum:=m Függvény vége. 208. 0. 8. 8:6 Zsakó László:: Rekurzió 28/3
Kiválogatás Programozási tételek rekurzívan Bemenet:, XH, T:HL Kimenet: Db, Y Előfeltétel: Utófeltétel: (Db,Y)=válogat(X, X ) Definíció: válogat X,..., X válogat X,..., X (, ) ha T X válogat X,..., X (0, ) ha 0 egyébként 208. 0. 8. 8:6 Zsakó László:: Rekurzió 29/3
Programozási tételek rekurzívan Kiválogatás válogat(,x): Ha =0 akkor válogat:=(0,-) különben ha T(X()) akkor válogat:=válogat(-,x)(,) különben válogat:=válogat(-,x) Függvény vége. Válogat(,X,Db,Y): Ha =0 akkor Db:=0 különben Válogat(-,X,Db,Y) Ha T(X()) akkor Db:=Db+; Y(Db):= 208. 0. 8. 8:6 Zsakó László:: Rekurzió 30/3
Rekurzió előadás vége