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

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

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)

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

Feladatmegoldási stratégiák

Informatikai tehetséggondozás:

Rekurzív algoritmusok

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

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

A programozás alapjai 1 Rekurzió

Informatikai tehetséggondozás:

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

Kombinatorikai algoritmusok

Információs Technológia

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

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

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

Rekurzió. Dr. Iványi Péter

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

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

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

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

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).

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

Dinamikus programozás II.

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

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

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

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

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

ARCHIMEDES MATEMATIKA VERSENY

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.

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

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.

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

ELEMI PROGRAMOZÁSI TÉTELEK

Adatszerkezetek II. 10. előadás

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

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

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

Problémamegoldási stratégiák

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

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

Komplex számok. A komplex számok algebrai alakja

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

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

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

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Adatbázis rendszerek Gy: Algoritmusok C-ben

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

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

15. A VERSENYRENDEZÉS

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Diszkrét matematika 1.

Összetett programozási tételek

Numerikus módszerek 1.

Exponenciális, logaritmikus függvények

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

Algoritmusok pszeudókód... 1

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

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).

Algoritmusok pszeudókód... 1

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

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

Visszalépéses kiválogatás

Webprogramozás szakkör

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

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

Megoldás: Mindkét állítás hamis! Indoklás: a) Azonos alapú hatványokat úgy szorzunk, hogy a kitevőket összeadjuk. Tehát: a 3 * a 4 = a 3+4 = a 7

Programozás alapjai 1.Gy: Algoritmizálás P R O

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Norma Determináns, inverz Kondíciószám Direkt és inverz hibák Lin. egyenletrendszerek A Gauss-módszer. Lineáris algebra numerikus módszerei

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

Tartalomjegyzék Algoritmusok - pszeudókód

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

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

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

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

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

A valós számok halmaza

Gauss-Seidel iteráció

Megoldott feladatok november 30. n+3 szigorúan monoton csökken, 5. n+3. lim a n = lim. n+3 = 2n+3 n+4 2n+1

Algoritmusok és adatszerkezetek I. 4. előadás

Kalkulus I. gyakorlat Fizika BSc I/1.

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

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

Felvételi tematika INFORMATIKA

Feladatok, amelyek gráfokkal oldhatók meg 1) A königsbergi hidak problémája (Euler-féle probléma) a

Az R halmazt a valós számok halmazának nevezzük, ha teljesíti az alábbi 3 axiómacsoport axiómáit.

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

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

Arany Dániel Matematikai Tanulóverseny 2016/2017-es tanév Kezdők III. kategória I. forduló

Osztályozóvizsga követelményei

Megoldások. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) 1. Számítsd ki a következő kifejezések pontos értékét!

Osztályozóvizsga és javítóvizsga témakörei Matematika 9. évfolyam

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

Á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! Fibonacci-számok Fib n A rekurzió lényege: önhivatkozás n * n 1! ha n 0 1 ha n 0 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1

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 90 lesz, minden 100-nál kisebb n-re. ha ha n 100 n 100 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 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 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) 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), 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 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)) M(n): Ha n>100 akkor M:=n-10 különben x:=m(n+11); M:=M(x) Tehát a dupla rekurzió algoritmikus szinten nem okoz semmilyen gondot! 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)) Tehát a dupla rekurzió algoritmikus szinten nem okoz semmilyen gondot! 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 Páros:=Páratlan(n-1) Függvény vége. Páratlan(n): Ha n=1 akkor Páratlan:=igaz különben Páratlan:=Páros(n-1) Függvény vége.

Rekurzív eljárás Gyorsrendezés (quick sort): N elem rendezését a következőképpen végezhetjük: Válogassuk szét az elemeket az első elemnél kisebbekre, illetve nagyobbakra! A két keletkezett részre (ha legalább 2 elemet tartalmaznak) alkalmazzuk ugyanezt az eljárást! 11

Gyorsrendezés (quick sort): Rekurzív eljárás 12

Gyorsrendezés: Rekurzív eljárá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) Meggondolandó: 1. a paraméterek eltérő hozzáférési joga; 2. a Szétválogat eljárás; 3. milyen szélsőséges helyzetek adódnak hatékonyság szempontjából. 13

Gyorsrendezés: Quick(A,e,v): Szétválogat(A,e,v,k) Rendezés(A,e,k-1) Rendezés(A,k+1,v) Rekurzív eljárás Rendezés(A,e,v): Ha v-e>0 akkor Quick(A,e,v) Közvetlen rekurzió: Az A eljárás saját magát hívja. Közvetett rekurzió: A hívja B-t, B hívja A-t. 14

Szétválogatás helyben: Rekurzív eljárás Szétválogat(A,e,v,k): i:=e; j:=v; y:=a(e) Ciklus amíg ij Ciklus amíg ij és A(j)y j:=j-1 Ciklus vége Ha ij akkor A(i):=A(j); j:=j-1 Ciklus amíg ij és A(i)y i:=i+1 Ciklus vége Ha ij akkor A(j):=A(i); i:=i+1 Ciklus vége A(i):=y; k:=i 15

Rekurzív eljárás Feladat: Egy kép egy adott (fehér színű) tartományát egy (A,B) belső pontjából kiindulva fessük be világoskékre! Festendők a belső pontok, azaz Belső(i,j)=(i=A és j=b) vagy Fehér(i,j) és (Belső(i 1,j) vagy Belső(i+1,j) vagy Belső(i,j 1) vagy Belső(i,j+1))

Rekurzív eljárás Rekurzív festés pontonként: RekPont(x,y): Pont(x,y) Ha Üres(x-1,y) akkor RekPont(x-1,y) Ha Üres(x,y-1) akkor RekPont(x,y-1) Ha Üres(x+1,y) akkor RekPont(x+1,y) Ha Üres(x,y+1) akkor RekPont(x,y+1) 17

Koch fraktál: Rekurzió Logo nyelven Vegyünk egy egységnyi szakaszt! Vágjuk ki a középső harmadát! Illesszük be a kivágott részt egy egyenlő oldalú háromszög oldalaiként! Alkalmazzuk ugyanezt az így kapott 4 szakaszra! 18

Rekurzió Logo nyelven Koch fraktál, Logo megoldás: Tanuld koch :n :h Ha :n=0 [előre :h] [koch :n-1 :h/3 balra 60 koch :n-1 :h/3 jobbra 120 koch :n-1 :h/3 balra 60 koch :n-1 :h/3] Vége koch 1 100 koch 2 100 19

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. 20

Rekurzív eljárás Hanoi tornyai: 21

Hanoi tornyai: Rekurzív eljárás Hanoi(n,A,B,C): Ha n>0 akkor Hanoi(n-1,A,C,B) Ki: N,A,B Hanoi(n-1,C,B,A) Elágazás vége 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 22

A megvalósítás problémái Problémák Állatorvosi ló (-: csacsi :-) a faktoriális függvény Fakt(n): Ha n=0 akkor f:=1 különben f:=n*fakt(n-1) Fakt:=f Függvény vége. 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 lekezelésére. (Visszatérési cím a verembe; aktuális és formális paraméterek összekapcsolása.) 23

A megvalósítás problémái Összefoglalva a problémákat: 1. 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? 2. 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? 3. A lokális változók egyedisége. 24

A megvalósítás problémái A megoldás vázlata: 1. és 3. probléma belépéskor vermelés, kilépéskor verembő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: Fakt(n): Verembe(n) Ha n=0 akkor f:=1 különben Fakt(n-1); Veremből(f) n:=veremtető; f:=n*f Veremből(n); Verembe(f) 25

A megvalósítás problémái Általános séma a rekurzió végrehajtására: Rekurzív(paraméterek): Rekurzív(paraméterek) Rekurzív(paraméterek): Verembe(bemenő paraméterek, lokális változók) Rekurzív(paraméterek) Veremből(bemenő paraméterek, lokális változók) 26

A megvalósítás problémái Megjegyzés: Ha a bemenő paramétereknek és a lokális változóknak a fordítóprogram eleve a veremben foglal helyet, akkor nincs vermelési idő. Rekurzív függvények esete: Rekfgv(paraméterek): Verembe(bemenő paraméterek, lokális változók) Rekfgv(paraméterek); Veremből(érték) Veremből(bemenő paraméterek, lokális változók) Verembe(érték) 27

Bajok a rekurzióval Hely: nagyra dagadt veremméret. Problémák a rekurzióval 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.

Rekurzió és iteráció 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 29

Rekurzió és iteráció 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. 30

Rekurzió és iteráció 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):=, ha a g() függvény kiszámítása nem függ a paraméter sorrendtől. 31

Rekurzió és iteráció Példa: Fibonacci-számok 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) 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. 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 32

Példa: Fibonacci-számok 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. Rekurzió és iteráció Fib n 0 ha n 0 1 ha n 1 Fib n 1 Fib n 2 ha n 1 33

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.

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.

Feladat Közvetett rekurzió 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!

Közvetett rekurzió Az első oszlop középső négyzete háromféleképpen fedhető le. 1. eset 2. eset 3. eset

Közvetett rekurzió 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ó

Közvetett rekurzió 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

Közvetett rekurzió 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

Közvetett rekurzió 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.

Közvetett rekurzió 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!

Közvetett rekurzió A(n): Ha n=1 akkor A:=0 különben ha n=2 akkor A:=3 különben ha TA(n)<0 akkor TA(n):=A(n-2)+2*B(n-1) A:=TA(n) 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 ha TB(n)<0 akkor TB(n):=A(n-1)+B(n-2) B:=TB(n) Függvény vége.

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). 44

Rekurzió és iteráció Jobbrekurzió alapesetei R(x): S(x) Ha p(x) akkor R(x) R(x): Ciklus S(x) amíg p(x) Ciklus vége Azaz az átírás egy egyszerű hátultesztelős ciklus. 45

Rekurzió és iteráció Jobbrekurzió alapesetei R(x): Ha p(x) akkor T(x); R(x) R(x): Ciklus amíg p(x) T(x) Ciklus vége Azaz az átírás egy egyszerű elöltesztelős ciklus. 46

Rekurzió és iteráció Jobbrekurzió alapesetei R(x): S(x) Ha p(x) akkor T(x); R(x) különben U(x) R(x): S(x) Ciklus amíg p(x) T(x); S(x) Ciklus vége U(x) 47

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ó)) Rekurzió és iteráció Kiír(szó): Ciklus amíg nem üres?(szó) Ki: első(szó) szó:=elsőutániak(szó) Ciklus vége 48

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 Ez nem a formális jobbrekurzió változat, első lépésként tehát formális jobbrekurzióvá kell alakítani! 49

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) 50

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 51

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) 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 52

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 megke-resé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) 53

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. 54

Rekurzió és iteráció 55

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 56

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 57

Balrekurzió példa Rekurzió és iteráció Egy szó tükrözve kiírása, azaz betűi sor-rendje megfordítása: Tükröz(szó): Ha nem üres?(szó) akkor Kiír(elsőutániak(szó)) Ki: első(szó) 58

Balrekurzió példa Rekurzió és iteráció Egy szó tükrözve kiírása, azaz betűi sorrendje megfordítása: Kiír(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 59

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): N:=0 Ciklus amíg KM K:=2*K; N:=N+1 Ciklus vége Ciklus I=1-től N-ig K:=K/2; Ki: K Ciklus vége 60

Rekurzió előadás vége