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

Hasonló dokumentumok
Algoritmizálás, adatmodellezés tanítása 11. előadás. (Horváth Gyula előadása alapján)

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

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

Feladatmegoldási stratégiák

Informatikai tehetséggondozás:

Rekurzió 2. Belépő a tudás közösségébe Informatika szakköri segédanyag

5. Rekurzió és iteráció (Rekurzív programok átírása nemrekurzívvá)

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

Informatikai tehetséggondozás:

Rekurzív algoritmusok

A programozás alapjai 1 Rekurzió

Rekurzió. Működése, programtranszformációk. Programozás II. előadás. Szénási Sándor.

Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

1.1. Alapfeladatok. hogy F 1 = 1, F 2 = 1 és általában F n+2 = F n+1 + F n (mert a jobboldali ág egy szinttel lennebb van, mint a baloldali).

Kombinatorikai algoritmusok

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Információs Technológia

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Dinamikus programozás II.

Adatszerkezetek II. 10. előadás

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

A sorozat fogalma. függvényeket sorozatoknak nevezzük. Amennyiben az értékkészlet. az értékkészlet a komplex számok halmaza, akkor komplex

Problémamegoldási stratégiák


Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

Algoritmizálás, adatmodellezés tanítása 7. előadás

Algoritmizálás, adatmodellezés tanítása 6. előadás

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

A 2009/2010 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

Algoritmizálás, adatmodellezés tanítása 8. előadás

Sorozatok I. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma)

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Rekurzió. Témakörök. Rekurzió alapelve. Rekurzió alapjai Rekurzív algoritmusok végrehajtása Visszalépéses keresés Programtranszformációk

Gauss-Jordan módszer Legkisebb négyzetek módszere, egyenes LNM, polinom LNM, függvény. Lineáris algebra numerikus módszerei

FPI matek szakkör 8. évf. 4. szakkör órai feladatok megoldásokkal. 4. szakkör, október. 20. Az órai feladatok megoldása

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Multihalmaz, intervallumhalmaz

ARCHIMEDES MATEMATIKA VERSENY

2012. október 2 és 4. Dr. Vincze Szilvia

A 2012/2013 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

minden x D esetén, akkor x 0 -at a függvény maximumhelyének mondjuk, f(x 0 )-at pedig az (abszolút) maximumértékének.

Diszkrét matematika 1.

Bevezetés az algebrába az egész számok

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

FFT. Második nekifutás. Czirbusz Sándor ELTE IK, Komputeralgebra Tanszék október 2.

Sorozatok, sorozatok konvergenciája

A félév során előkerülő témakörök

REKURZIÓ. Rekurzív: önmagát ismétlő valami (tevékenység, adatszerkezet stb.) Rekurzív függvény: függvény, amely meghívja saját magát.

Hatékonyság 1. előadás

Visszalépéses kiválogatás

Szittyai István december 8. SZTE Bolyai Intézet. Szittyai István (NLG, Hmvh) Partíciók , Bolyai, Szeged 1 / 24

3. Előadás. Megyesi László: Lineáris algebra, oldal. 3. előadás Lineáris egyenletrendszerek

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

ABSZTRAKCIÓ FÜGGVÉNYEKKEL (ELJÁRÁSOKKAL)

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

1. feladatsor: Vektorterek, lineáris kombináció, mátrixok, determináns (megoldás)

I. VEKTOROK, MÁTRIXOK

Algoritmizálás, adatmodellezés tanítása 1. előadás

Exponenciális, logaritmikus függvények

JÁKLI AIDA JUHÁSZ TIBOR A FIBONACCI-SOROZAT ÁLTALÁNOSÍTÁSAI. Kiegészítés a Programozási ismeretek versenyzőknek című könyvhöz (Műszaki Kiadó, 2015)

Diszkrét matematika 1.

Számítógépek felépítése

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Összetett programozási tételek

11. Előadás. 11. előadás Bevezetés a lineáris programozásba

Adatbázis rendszerek Gy: Algoritmusok C-ben

PROGRAMOZÁSI TÉTELEK

Algoritmizálás és adatmodellezés tanítása 2. előadás

A 2013/2014 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

MBNK12: Permutációk (el adásvázlat, április 11.) Maróti Miklós

Arany Dániel Matematikai Tanulóverseny 2014/2015-ös tanév első (iskolai) forduló Haladók II. kategória

Műveletek mátrixokkal. Kalkulus. 2018/2019 ősz

Algoritmusok pszeudókód... 1

A 2012/2013 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. II. (programozás) kategória

2010. október 12. Dr. Vincze Szilvia

ALGORITMIKUS SZERKEZETEK ELÁGAZÁSOK, CIKLUSOK, FÜGGVÉNYEK

ELEMI PROGRAMOZÁSI TÉTELEK

Definíció n egymástól megkülönböztethető elem egy sorrendjét az n elem egy (ismétlés nélküli) permutációjának nevezzük.

Kép mátrix. Feladat: Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 2/35

Tanmenet a évf. fakultációs csoport MATEMATIKA tantárgyának tanításához

GRÁFELMÉLET. 7. előadás. Javító utak, javító utak keresése, Edmonds-algoritmus

Bevezetés a matematikába (2009. ősz) 1. röpdolgozat

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

f(x) vagy f(x) a (x x 0 )-t használjuk. lim melyekre Mivel itt ɛ > 0 tetszőlegesen kicsi, így a a = 0, a = a, ami ellentmondás, bizonyítva

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

1. A polinom fogalma. Számolás formális kifejezésekkel. Feladat Oldjuk meg az x2 + x + 1 x + 1. = x egyenletet.

konvergensek-e. Amennyiben igen, számítsa ki határértéküket!

1.1. Alapfogalmak. Vektor: R 2 beli elemek vektorok. Pl.: (2, 3) egy olyan vektor aminek a kezdo pontja a (0, 0) pont és a végpontja a

Nagypontosságú aritmetika I.

A rész (30 pont) A.1. Vajon mit csinál? (5 pont) A generál(n) algoritmus egy n természetes számot dolgoz fel (0 < n < 100).

A rekurzív algoritmusok tanításáról

Matematika tanmenet 11. évfolyam (középszintű csoport)

A 2010/2011 tanévi Országos Középiskolai Tanulmányi Verseny első forduló feladatainak megoldása. INFORMATIKÁBÓL II. (programozás) kategóriában

1. A Horner-elrendezés

Baran Ágnes. Gyakorlat Komplex számok. Baran Ágnes Matematika Mérnököknek Gyakorlat 1 / 33

6. Függvények. 1. Az alábbi függvények közül melyik szigorúan monoton növekvő a 0;1 intervallumban?

Átírás:

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

Rekurzió Klasszikus példák Faktoriális n! n * n 1! ha n 0 1 ha n 0 Fibonacci-számok Fib n 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 A rekurzió lényege: önhivatkozás 9:28 Zsakó László: Rekurzió 2/47

Klasszikus példák Binomiális számok: Rekurzió,,, B n k 1 ha k 0 B n 1 k B n 1 k 1 ha 0 k n 1 ha k n 1 ha k n k B n, k 0 1 1 ha 0 k n k, B n k McCarthy-féle 91-es függvény: M n M n 10 M n 11 Értéke 91 lesz, minden 100-nál kisebb n-re. ha ha n 100 n 100 9:28 Zsakó László: Rekurzió 3/47 3

Klasszikus példák Ackermann-függvény:,, A n m Elvadultságáról: A(0,m)=m+1 A(1,m)=m+2 A(2,m)=2*m+3 A(3,m)=2 m+3-3 Rekurzió m 1 ha n 0 A n 1 1 ha n 0 és m 0 An 1, A n, m 1 ha n 0 és m 0 A(4,m)= 2-3, ahol az a 2-t m+2-ször tartalmazza kitevőként. A... 2 2 4, m 2 3 9:28 Zsakó László: Rekurzió 4/47 4

Faktoriális: Rekurzív specifikáció és algoritmus n! n * n 1! ha n 0 1 ha n 0 Fakt(n): Ha n>0 akkor Fakt:=n*Fakt(n-1) különben Fakt:=1 Eljárás vége. 9:28 Zsakó László: Rekurzió 5/47 5

Fibonacci számok: Rekurzív specifikáció és algoritmus Fib n 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 Fib(n): Ha n=0 akkor Fib:=0 különben ha n=1 akkor Fib:=1 különben Fib:=Fib(n-1)+Fib(n-2) Eljárás vége. Lame számok: Lame(n)=Lame(n-1)+Lame(n-3) Q számok: Q(n)=Q(n-Q(n-1))+Q(n-Q(n-2)) 9:28 Zsakó László: Rekurzió 6/47 6

Binomiális számok: Rekurzív specifikáció,,, B n k és algoritmus 1 ha k 0 B n 1 k B n 1 k 1 ha 0 k n 1 ha k n Bin(n,k): Ha k=0 vagy k=n akkor Bin:=1 különben Bin:=Bin(n-1,k)+Bin(n-1,k-1) Eljárás vége., Bn, k 1 B n k 1 ha k n k 0 1 ha 0 k n k Bin(n,k): Ha k=0 akkor Bin:=1 különben Bin:=Bin(n,k-1)*(n-k+1)/k Eljárás vége. 9:28 Zsakó László: Rekurzió 7/47 7

McCarthy 91-függvény: Rekurzív specifikáció M és algoritmus n M n 10 M n 11 ha ha n 100 n 100 M(n): Ha n>100 akkor M:=n-10 különben M:=M(M(n+11)) Eljárás vége. M(n): Ha n>100 akkor M:=n-10 különben x:=m(n+11); M:=M(x) Eljárás vége. Tehát a dupla rekurzió algoritmikus szinten nem okoz semmilyen gondot! 9:28 Zsakó László: Rekurzió 8/47 8

Ackermann függvény: Rekurzív specifikáció,, A n m és algoritmus m 1 ha n 0 A n 1 1 ha n 0 és m 0 An 1, A n, m 1 ha n 0 és m 0 Ack(n,m): Ha n=0 akkor Ack:=m+1 különben ha m=0 akkor Ack:=Ack(n-1,1) különben Ack:=Ack(n-1,Ack(n,m-1)) Eljárás vége. Tehát a dupla rekurzió algoritmikus szinten nem okoz semmilyen gondot! 9:28 Zsakó László: Rekurzió 9/47 9

Feladat Közvetett rekurzió Döntsük el egy számról, hogy páros-e, ha nincs maradékszámítás műveletünk! Megoldás Páros(n): Ha n=0 akkor Páros:=igaz különben ha n=1 akkor Páros:=hamis különben Páros:=Páratlan(n-1) Függvény vége. 9:28 Zsakó László: Rekurzió 10/47

Feladat Közvetett rekurzió Döntsük el egy számról, hogy páros-e, ha nincs maradékszámítás műveletünk! Megoldás Páratlan(n): Ha n=0 akkor Páratlan:=hamis különben ha n=1 akkor Páratlan:=igaz különben Páratlan:=Páros(n-1) Függvény vége. 9:28 Zsakó László: Rekurzió 11/47

Feladat Közvetett rekurzió Döntsük el egy számról, hogy páros-e, ha nincs maradékszámítás műveletünk! A két közvetetten rekurzív eljárás összevonható: Megoldás Páros(n): Ha n=0 akkor Páros:=igaz különben ha n=1 akkor Páros:=hamis különben Páros:=Páros(n-2) Függvény vége. 9:28 Zsakó László: Rekurzió 12/47

Hanoi tornyai: Rekurzív eljárás Adott 3 rudacska. Az elsőn egyre csökkenő sugarú korongok vannak. Az a feladat, hogy tegyük át a harmadik rudacskára a korongokat egyenként úgy, hogy az átpakolás közben és természetesen a végén is minden egyes korongon csak nála kisebb lehet. Az átpakoláshoz lehet segítségül felhasználni a középső rudacs-kát. 9:28 Zsakó László: Rekurzió 13/47 13

Rekurzív eljárás Hanoi tornyai: 9:28 Zsakó László: Rekurzió 14/47 14

Rekurzív eljárás Hanoi tornyai: Hanoi(n,A,B,C): Ha n>0 akkor Elágazás vége Eljárás vége. Hanoi(n-1,A,C,B) Ki: N,A,B Hanoi(n-1,C,B,A) Hanoi(n,A,B,C): Ha n>1 akkor Hanoi(n-1,A,C,B) Ki: n,a,b Hanoi(n-1,C,B,A) különben Ki: n,a,b Eljárás vége. 9:28 Zsakó László: Rekurzió 15/47 15

Bajok a rekurzióval Problémák a rekurzióval Hely: nagyra dagadt veremméret. Idő:a vermelés adminisztrációs többletterhe, a többszörösen ismétlődő hívások. Pl. Fibonacci-számoknál: r(n):=az N. Fibonacci-szám kiszámításához szükséges hívások száma r(0):=1, r(1):=1, r(i):=r(i-1)+r(i-2)+1 Állítás: a) r(i)=f(i+1)+f(i)+f(i-1)-1 i>1 b) r(i)=2*f(i+1)-1, ahol F(i)=az i. Fibonacci-szám. 9:28 Zsakó László: Rekurzió 16/47

Korlátos memóriájú függvények Korlátos memóriájú függvények Ha egy rekurzív függvény minden értéke valamely korábban kiszámolható értékből számolható, akkor némi memóriafelhasználással elkészíthető a rekurzió mentes változat, amelyben az egyes függvényértékeknek megfeleltetünk egy F(N) vektort. A függvény általános formája: f i g h f i 1, f i 2,..., f i K i ha ha i K 0 i K 9:28 Zsakó László: Rekurzió 17/47 17

Korlátos memóriájú függvények Korlátos memóriájú függvények f(n): Ha N<K akkor f:=h(n) különben f:=g(f(n-1),...,f(n-k)) Függvény vége. Az ennek megfelelő vektoros változat: f(n): Ciklus I=0-tól K-1-ig F(I):=h(I) Ciklus vége Ciklus I=K-tól N-ig F(I):=g(F(I-1),...,F(I-K)) Ciklus vége f:=f(n) Függvény vége. 9:28 Zsakó László: Rekurzió 18/47 18

Korlátos memóriájú függvények Korlátos memóriájú függvények Ez így természetesen nem hatékony tárolás, hiszen a rekurzív formulából látszik, hogy minden értékhez csak az őt megelőző K értékre van szükség. A hatékony megoldásban az alábbi ciklust kell átalakítani: Ciklus I=K-tól N-ig F(I):=g(F(I-1),...,F(I-K)) Ciklus vége Lehet pl. F(I mod K):=g(F(K-1),...,F(0)), ha a g() függvény kiszámítása nem függ a paraméter sorrendtől. 9:28 Zsakó László: Rekurzió 19/47 19

Korlátos memóriájú függvények Példa: Fibonacci-számok 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 Fib n Fib(n): Ha n=0 akkor Fib:=0 különben ha n=1 akkor Fib:=1 különben Fib:=Fib(n-1)+Fib(n-2) Eljárás vége. Fib(n): F(0):=0; F(1):=1 Ciklus i=2-től n-ig F(i):=F(i-1)+F(i-2) Ciklus vége Fib:=F(n) Függvény vége. 9:28 Zsakó László: Rekurzió 20/47 20

Korlátos memóriájú függvények Példa: Fibonacci-számok Fib n Helytakarékos megoldás: Fib(n): F(0):=0; F(1):=1 Ciklus i=2-től n-ig F(i mod 2):=F(0)+F(1) Ciklus vége Fib:=F(n mod 2) Függvény vége. 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 9:28 Zsakó László: Rekurzió 21/47 21

Rekurzió memorizálással Megoldási ötlet: amit már kiszámoltunk egyszer, azt ne számoljuk újra! Tároljuk a már kiszámolt értékeket, s ha szükségünk van rájuk, használjuk fel őket! A megoldásban F(i)0 jelenti, ha már kiszámoltuk az i-edik Fibonacci számot. Fib(N): Ha F(N)<0 akkor ha N<2 akkor F(N):=N különben F(N):=Fib(N-1)+Fib(N-2) Fib:=F(N) Függvény vége. 9:28 Zsakó László: Rekurzió 22/47

Rekurzió memorizálással Binomiális együtthatók számolása. Bin(N,K): Ha N=0 vagy N=K akkor Bin:=1 különben Bin:=Bin(N-1,K-1)+Bin(N-1,K) Függvény vége. Ugyanez memorizálással: Bin(N,K): Ha B(N,K)<0 akkor Ha N=0 vagy N=K akkor B(N,K):=1 különben B(N,K):=Bin(N-1,K-1)+Bin(N-1,K) Elágazás vége Bin:=B(N,K) Függvény vége. 9:28 Zsakó László: Rekurzió 23/47

Feladat Közvetett rekurzió - járdakövezés Számítsuk ki, hogy hányféleképpen lehet egy n egység méretű járdát kikövezni 1x1, 1x2 és 1x3 méretű lapokkal! Az első helyre tehetünk 1x1-es lapot: Az első helyre tehetünk 1x2-es lapot: Az első helyre tehetünk 1x3-as lapot: Az első esetben n-1, a másodikban n-2-t, a harmadikban pedig n-3 cellát kell még lefednünk. Azaz az n cella lefedéseinek Lefed(n) száma Lefed(n-1)+Lefed(n-2)+Lefed(n-3). 9:28 Zsakó László: Rekurzió 24/47

Megoldás Közvetett rekurzió - járdakövezés Lefed(N): Elágazás N=1 esetén Lefed:=1 N=2 esetén Lefed:=2 N=3 esetén Lefed:=4 egyéb esetben Lefed:=Lefed(N-1)+ Lefed(N-2)+Lefed(N-3) Elágazás vége Függvény vége. Sokszoros hívás esetén vagy memorizálás, vagy ciklusos megoldás kell! 9:28 Zsakó László: Rekurzió 25/47

Feladat Közvetett rekurzió - járdakövezés Számítsuk ki, hogy hányféleképpen lehet egy 2xn egység méretű járdát kikövezni 1x2 és 1x3 méretű lapokkal! 9:28 Zsakó László: Rekurzió 26/47

Közvetett rekurzió - járdakövezés Az első oszlop egyféleképpen fedhető le: Az első két oszlop további elrendezéssel újra egyféleképpen fedhető le: Az első három oszlop újra egyféleképpen: Sajnos ez is előfordulhat: 9:28 Zsakó László: Rekurzió 27/47

Jelölje A(n) a megoldás értékét 2xn egység méretű járda esetén! Jelölje B(n) a megoldás értékét 2xn egység méretű járda esetén, ha az egyik jobboldali sarok nincs befestve! A n B n A n A n Közvetett rekurzió - járdakövezés 1 2 4 1 An 2 An 3 2Bn 2 0 0 1 3 Bn 1 Bn 3 ha ha ha n n ha ha ha ha n 1 9:28 Zsakó László: Rekurzió 28/47 ha n 2 3 3 n 1 n 2 n 3 n 3

Közvetett rekurzió - járdakövezés A(n): Ha n=1 akkor A:=1 különben ha n=2 akkor A:=2 különben ha n=3 akkor A:=4 különben A:=A(n-1)+A(n-2)+A(n-3)+2*B(n-2) Függvény vége. B(n): Ha n<3 akkor B:=0 különben ha n=3 akkor B:=1 különben B:=A(n-3)+B(n-1)+B(n-3) Függvény vége. 9:28 Zsakó László: Rekurzió 29/47

Feladat Közvetett rekurzió - járdakövezés Számítsuk ki, hogy hányféleképpen lehet egy 3xn egység méretű járdát kikövezni 1x2 méretű lapokkal! Megoldás Biztos nincs megoldás, ha n páratlan szám! 9:28 Zsakó László: Rekurzió 30/47

Közvetett rekurzió - járdakövezés Az első oszlop középső négyzete háromféleképpen fedhető le. 1. eset 2. eset 3. eset 9:28 Zsakó László: Rekurzió 31/47

Közvetett rekurzió - járdakövezés Az egyes esetek csak az alábbi módon folytathatók: Jelölje A(n) a megoldás értékét 3xn egység méretű járda esetén! Az 1. eset csak így folytatható 9:28 Zsakó László: Rekurzió 32/47

Közvetett rekurzió - járdakövezés Jelölje B(n) azt, hogy hányféleképpen fedhető le egy 3xn egység méretű járda, amelynek a bal alsó sarka már le van fedve! Szimmetria miatt a jobb felső sarok lefedettsége esetén is B(n)- féle lefedés van. A 2. eset csak így folytatható A n A n 0 3 2 2 Bn 1 ha ha ha A 3. eset csak így folytatható n 1 n 2 n 2 9:28 Zsakó László: Rekurzió 33/47

Közvetett rekurzió - járdakövezés Az egyes esetek csak az alábbi módon folytathatók: Jelölje B(n) azt, hogy hányféleképpen fedhető le egy 3xn egység méretű járda, amelynek a bal alsó sarka már le van fedve! B(n) páros n-re mindig 0 értékű! A 2. eset csak így folytatható Az 1. eset csak így folytatható B n A n 1 0 1 Bn 2 ha ha ha n 1 n 2 n 2 9:28 Zsakó László: Rekurzió 34/47

Közvetett rekurzió - járdakövezés A(n): Ha n=1 akkor A:=0 különben ha n=2 akkor A:=3 különben A:=A(n-2)+2*B(n-1) Függvény vége. B(n): Ha n=1 akkor B:=1 különben ha n=2 akkor B:=0 különben B:=A(n-1)+B(n-2) Függvény vége. Kövezés(n): Ha páros(n) akkor Kövezés:=A(n) különben Kövezés:=0 Függvény vége. 9:28 Zsakó László: Rekurzió 35/47

Közvetett rekurzió - járdakövezés Szükség van itt memorizálásra? Igen, B(n-3)-hoz háromféle, A(n-4)-hez ötféle úton juthatunk el (B(n-3)-ból is számoljuk) Fibonacci számszor! Megjegyzés: Figyeljük meg, hogy csak minden második A(i) és B(i) értéket számoljuk ki! 9:28 Zsakó László: Rekurzió 36/47

A(n): Ha TA[n]<0 akkor Ha n=1 akkor TA[n]:=0 különben ha n=2 akkor TA[n]:=3 különben TA[n]:=A(n-2)+2*B(n-1) Elágazás vége A:=TA[n] Függvény vége. B(n): Ha TB[n]<0 Ha n=1 akkor TB[n]:=1 különben ha n=2 akkor TB[n]:=0 különben TB[n]:=A(n-1)+B(n-2) Elágazás vége B:=TB[n] Függvény vége. Közvetett rekurzió - járdakövezés 9:28 Zsakó László: Rekurzió 37/47

Rekurzió és iteráció Jobbrekurzió A rekurzió problematikáját mint láttuk a lokális adatok, ill. paraméterek kezelése jelenti. Ha az eljárás utolsó utasításaként szerepel a rekurzív hívás, akkor nincs szükség a lokális adatok és paraméterek visszaállítására, azaz vermelésére. Ezt az esetet nevezzük jobbrekurziónak (vagy hosszabban jobboldali rekurziónak). 9:28 Zsakó László: Rekurzió 38/47 38

Rekurzió és iteráció Jobbrekurzió alapesetei R(x): S(x) Ha p(x) akkor R(x) Eljárás vége. R(x): Ciklus S(x) amíg p(x) Ciklus vége Eljárás vége. Azaz az átírás egy egyszerű hátultesztelős ciklus. 9:28 Zsakó László: Rekurzió 39/47 39

Rekurzió és iteráció Jobbrekurzió alapesetei R(x): Ha p(x) akkor T(x); R(x) Eljárás vége. R(x): Ciklus amíg p(x) T(x) Ciklus vége Eljárás vége. Azaz az átírás egy egyszerű elöltesztelős ciklus. 9:28 Zsakó László: Rekurzió 40/47 40

Rekurzió és iteráció Jobbrekurzió alapesetei R(x): S(x) Ha p(x) akkor T(x); R(x) különben U(x) Eljárás vége. R(x): S(x) Ciklus amíg p(x) T(x); S(x) Ciklus vége U(x) Eljárás vége. 9:28 Zsakó László: Rekurzió 41/47 41

Jobbrekurzió példa Egy szó kiírása: Kiír(szó): Ha nem üres?(szó) akkor Ki: első(szó) Kiír(elsőutániak(szó)) Eljárás vége. Rekurzió és iteráció Kiír(szó): Ciklus amíg nem üres?(szó) Ki: első(szó) szó:=elsőutániak(szó) Ciklus vége Eljárás vége. 9:28 Zsakó László: Rekurzió 42/47 42

Rekurzió és iteráció Jobbrekurzió példa Logaritmikus kiválasztás (az A vektor E. és V. eleme között az X elem biztosan megtalálható): Kiválasztás(A,X,K,E,V): K:=(E+V) div 2 Elágazás A(K)<X esetén Kiválasztás(A,X,K,K+1,V) A(K)>X esetén Kiválasztás(A,X,K,E,K-1) Elágazás vége Eljárás vége. Ez nem a formális jobbrekurzió változat, első lépésként tehát formális jobbrekurzióvá kell alakítani! 9:28 Zsakó László: Rekurzió 43/47 43

Rekurzió és iteráció Jobbrekurzió példa Logaritmikus kiválasztás (az A vektor E. és V. eleme között az X elem biztosan megtalálható): Kiválasztás(A,X,K,E,V): K:=(E+V) div 2 Elágazás A(K)<X esetén E:=K+1 A(K)>X esetén V:=K-1 Elágazás vége Ha A(K)X akkor Kiválasztás(A,X,K,E,V) Eljárás vége. 9:28 Zsakó László: Rekurzió 44/47 44

Rekurzió és iteráció Jobbrekurzió példa Logaritmikus kiválasztás (az A vektor E. és V. eleme között az X elem biztosan megtalálható): Kiválasztás(A,X,K,E,V): Ciklus K:=(E+V) div 2 Elágazás A(K)<X esetén E:=K+1 A(K)>X esetén V:=K-1 Elágazás vége amíg A(K)X Ciklus vége Eljárás vége. 9:28 Zsakó László: Rekurzió 45/47 45

Rekurzió és iteráció Nem tisztán jobbrekurzió példa Gyorsrendezés: Quick(A,e,v): 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. Quick(A,e,v): Ciklus Szétválogat(A,e,v,k) Ha k-e>1 akkor Quick(A,e,k-1) e:=k+1 amíg v-k>1 Ciklus vége Eljárás vége. 9:28 Zsakó László: Rekurzió 46/47 46

Rekurzió előadás vége