rekurzió - eltealgtan1.elte.hu/downloads/eloadas/rekurzio2.pdf2 2020. 11. 09. rekurzió és...

31
Rekurzió (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Upload: others

Post on 07-Feb-2021

1 views

Category:

Documents


0 download

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