Rekurzió. Tartalomjegyzék. Készítette: Gál Tamás

Hasonló dokumentumok
Rekurzív algoritmusok

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.

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

Adatbázis rendszerek Gy: Algoritmusok C-ben

Adatszerkezetek és algoritmusok

Eljárások, függvények

INFORMATIKA javítókulcs 2016

Közismereti informatika 2.zh T-M szakirány

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

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

I. Egydimenziós tömb elemeinek rendezése

Programozás alapjai. 5. előadás

14. Mediánok és rendezett minták

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

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

Információs Technológia

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

BME MOGI Gépészeti informatika 5.

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

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

A programozás alapjai 1 Rekurzió

Programozási segédlet

BABEŞ-BOLYAI TUDOMÁNYEGYETEM MATEMATIKA-INFORMATIKA KAR Felvételi verseny - minta Informatika írásbeli

Egyszerű programozási tételek

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

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

Algoritmusok - pszeudókód... 1

BME MOGI Gépészeti informatika 4.

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Felvételi tematika INFORMATIKA

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

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

Egyszerű programok készítése Kifejezések Bitszintű műveletek Relációs műveletek... 58

Tartalomjegyzék Algoritmusok - pszeudókód

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

Algoritmuselmélet 2. előadás

Webprogramozás szakkör

Megoldott feladatok. Informatika

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

6. A Pascal nyelv utasításai

Objektumorientált Programozás VI.

Algoritmizálás + kódolás C++ nyelven és Pascalban

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

Bakalárska práca Bakalár munka

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Programozás alapjai C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

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

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

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

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

3. Gyakorlat Ismerkedés a Java nyelvvel

INFORMATIKA tétel 2019

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

Algoritmusok vektorokkal keresések 1

Rekurzió. Programozás alapjai C nyelv 9. gyakorlat. Rekurzív algoritmus. Rekurzív algoritmus fajtái. Példa: n! (2) Példa: n!

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

.Net adatstruktúrák. Készítette: Major Péter

hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

INFORMATIKAI ALAPISMERETEK

Rekurzió. Dr. Iványi Péter

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

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

Informatika terméktervezőknek

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

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

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Egyszerű programozási tételek

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

10. gyakorlat Tömb, mint függvény argumentum

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Programozás alapjai 8.Gy: Program struktúra

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

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

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Alprogramok, paraméterátadás

A C# programozási nyelv alapjai

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

<... < s n. Írjuk le a megoldási módszert, és adjunk meg egy megjegyzésekkel ellátott Pascal-programot. A bemeneti adatokat helyesnek tekintjük.

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Szoftvertervezés és -fejlesztés I.

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Érdekes informatika feladatok

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

OOP: Java 1.Gy: Java alapok

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

Programozási módszertan. Mohó algoritmusok

Egyszerű példaprogramok gyakorláshoz

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Átírás:

Rekurzió Tartalomjegyzék Rekurzió..2 Kérdések, feladatok2 Hatványozás rekurzióval.3 Faktoriális számítás rekurzióval..4 Kérdések, feladatok5 Fibonacci sorozat.6 Kérdések, feladatok6 QuickSort (gyorsrendezés).7 Kérdések, feladatok9 Iteratív bináris keresés10 Rekurzív bináris keresés12 Hanoi-tornyai..14 Kérdések, feladatok.17 Készítette: Gál Tamás Közzétéve: http://informatika.gtportal.eu/ Creative Commons -Nevezd meg!-ne add el!-így add tovább! 2.5 Magyarország licenc alatt használható GT Rekurzió 1

Rekurzió Rekurzióról beszélünk, ha egy eljárás, függvény vagy metódus közvetve vagy közvetlenül önmagát hívja. Rekurzió célja egy összetett feladat visszavezetése egyszerűbb feladatok ismételt megoldására. Egy alprogram működése változatlan, de mindig saját magát hívja, de egyre egyszerűbb argumentumokkal. A ciklusokhoz hasonló módon rekurzió esetén is gondoskodni kell arról, hogy véges lépésszám után leálljon az alprogram ismételt meghívása, különben a program a végtelen ciklushoz hasonló módon viselkedik. A következő példakód hasonlóképp működik mint egy növekményes ciklus, amelynek ciklusváltozója 10-től indulva 1-ig csökken (0-nál kilép). Először meghívva az eljárást i=10. Ezt képernyőre írja, majd 1-el kisebb értékkel hívja saját magát. Mindaddig ismétli a folyamatot (kiírás, saját maga meghívása) amíg i>0. 0-nál leáll. Mondatszerű leírás: Függvény ismétel(i:egész típus): Ha i>0 akkor KI: i ismétel(i-1) Elágazás vége Függvény vége. Pascal kód: program Rekurzio; procedure ismetel(i:integer); if i>0 then writeln(i); ismetel(i-1); ismetel(10); Java kód: public static void main(string[] args) ismetel(10); static void ismetel(int i) if (i>0) System.out.println(i); ismetel(i-1); Kérdések, feladatok Módosítsd az ismetel nevű eljárást, úgy GT Rekurzió 2

Hatványozás rekurzióval Specifikáció: x n = x * xn-1 ha n > 0 1 ha n = 0 Mondatszerű leírás: Függvény Hatvány(x: valós, n: egész): valós Ha n > 0 akkor Hatvány := x * Hatvány(x, n-1) különben Hatvány := 1 Elágazás vége Függvény vége. Pascal kód: program Hatvanyozas; function hatvany(x:double; n:integer): Double; if n>0 then hatvany := x * hatvany(x, n-1) hatvany := 1; writeln('x:',x:3:0,' n:',n:2,' hatvány:',hatvany:4:0) writeln(hatvany(2,10):4:0); Java kód: public static void main(string[] args) System.out.println(hatvany(2,10)); static float hatvany(float x, int n) if (n>0) return x * hatvany(x, n-1); return 1; GT Rekurzió 3

Faktoriális számítás rekurzióval Az n N faktoriális (jelölés: n!) alatt az első n darab pozitív természetes szám szorzatát értjük, n=0 esetén pedig 1-et. Specifikáció: n! = n * (n 1)! ha n > 0 1 ha n = 0 Mondatszerű leírás: Függvény Faktoriális(n: egész): egész Ha n > 0 akkor Faktoriális := n * Faktoriális(n 1) különben Faktoriális := 1 Elágazás vége Függvény vége. Működés n=4 esetén: Faktoriális(4) = 4 * Faktoriális(3) = (verembe: 4, és visszatérési cím) 3 * Faktoriális(2) = (verembe: 3, és visszatérési cím) 2 * Faktoriális(1) = (verembe: 2, és visszatérési cím) 1 * Faktoriális(0) (verembe: 1, és visszatérési cím) Faktoriális(0)=1 1 * Faktoriális(0) (1*1= 1) (veremből: 1, és visszatérési cím) 2 * Faktoriális(1) = (2*1= 2) (veremből: 2, és visszatérési cím) 3 * Faktoriális(2) = (3*2= 6) (veremből: 3, és visszatérési cím) 4 * Faktoriális(3) = (4*6=24) (veremből: 4, és visszatérési cím) Faktoriális(4) = 24 [forrás: Petrik tananyagtár: Rekurzió] A rekurzió folyamata: a függvény a faktoriális számítását visszavezeti 1-gyel kisebb egész szám faktoriálisának a kiszámítására, amíg lehet. a számítás elvégzése közben újra és újra meghívja magát, miközben a számítás folytatásához szükséges értékeket és a visszatérési címeket verembe teszi. a folyamat legalsó szintjét a Faktoriális(0) jelenti, amelynek az értéke definíció szerint 1, itt ér véget a rekurzív hívások sorozata. ezután folyamatos visszahelyettesítések következnek, a folyamat minden szintjén, és a legfelső szinten meghatározásra kerül n! értéke. [forrás: Petrik tananyagtár: Rekurzió] GT Rekurzió 4

Pascal kód: program Faktorialis1; function Faktorialis(n:integer): integer; if n>0 then Faktorialis := n * Faktorialis(n - 1) Faktorialis := 1; writeln(faktorialis); writeln(faktorialis(4)); Java kód: public static void main(string[] args) System.out.println(Faktorialis(5)); static int Faktorialis(int n) if (n>0) return n * Faktorialis(n-1); return 1; Kérdések, feladatok Módosítsd az Faktorialis nevű alprogramot úgy, hogy a képernyőn visszatérés előtt jelenítse meg visszatérési értékét! A Faktorialis nevű alprogram hányszor hívja meg saját magát, ha n paraméterének értéke kezdetben 5? GT Rekurzió 5

Fibonacci sorozat A Fibonacci-sorozat első két eleme 0 és 1, a további elemeket az előző kettő összegeként kapjuk. Specifikáció: Fibonacci n = Fibonacci n-1 + Fibonacci n-2 ha n > 1 n ha n=0 n ha n=1 Mondatszerű leírás: Függvény Fibonacci(n: egész): egész Ha n > 1 akkor Fibonaccin := Fibonacci(n - 1) + Fibomacchi(n - 2) különben Fbonacchi := n Elágazás vége Függvény vége Pascal kód: program Fibonacci1; function Fibonacci(n:integer): integer; if n>1 then Fibonacci := Fibonacci(n - 1) + Fibonacci(n - 2) Fibonacci := n; writeln(fibonacci(4)); Java kód: public static void main(string[] args) System.out.println(Fibonacci(5)); static int Fibonacci(int n) if (n>1) return Fibonacci(n - 1) + Fibonacci(n - 2); return n; Kérdések, feladatok Módosítsd az Fibonacci nevű alprogramot úgy, hogy a képernyőn visszatérés előtt jelenítse meg visszatérési értékét! A Faktorialis nevű alprogram hányszor hívja meg saját magát, ha n paraméterének értéke kezdetben 6? GT Rekurzió 6

QuickSort (gyorsrendezés) A leghatékonyabb rendezési algoritmus. A tömb számtanilag középső elemét kiemelve, balról megkeressük az első olyan elemet, amely nagyobb vagy egyenlő a középső elemmel, majd jobbról az első kisebb vagy egyenlő elemet. Ha találunk 2 megfelelő elemet, akkor kicseréljük. A ciklus végére a kiemelt elemtől balra csak nála kisebb, jobbra pedig nagyobb elemek állnak. Rekurzív módon megismételjük a folyamatot a bal és a jobb oldali tartományra is. Egy sorozat rendezését rendre két kisebb részének rendezésére vezetjük vissza. Specifikáció: a:tömb(n) a rendezendő tömb Bal, Jobb: egészek a szétválogatásra kerülő rész eleje és vége, bemenő paraméterek k: egész az elválasztó elem pozíciója, kimenő paraméter Mondatszerű leírás: Eljaras Quicksort(Bal, Jobb) i := Bal j := Jobb Kozepsokulcs := A[(i+j)/2] Ciklus amíg i <= j Ciklus amíg A[i].K< Kozepsokulcs i := i + 1 Ciklus vége Ciklus amíg A[j].K > Kozepsokulcs j := j - 1 Ciklus vége Ha i<j akkor Csere( A[i], A[j] ) i:=i+1 j:=j-1 Elágazás vége Ciklus vége Ha Bal < j akkor Quicksort(Bal, j-1) Ha i < Jobb akkor Quicksort(i+1, Jobb) Eljárás vége GT Rekurzió 7

Pascal kód: Program QuicksortPrg; const n = 5; a: array[1..n] of integer = (135,50,-42,44,21); i, k: integer; procedure quicksort(bal,jobb:integer); i,j,k,pivot,x:integer; i:=bal; j:=jobb; Pivot:=a[(i+j) div 2]; while i<=j do while a[i]<pivot do inc(i); while a[j]>pivot do dec(j); if i<=j then x:=a[i]; a[i]:=a[j]; a[j]:=x; inc(i); dec(j); if Bal<j then quicksort(bal,j); if i<jobb then quicksort(i,jobb); quicksort(1,n); for i:=1 to n do writeln(i,'. elem:',a[i]); -------------------------------------------------------------------------- Java kód: public static void main(string[] args) int[] a = 135,50,-42,44,21; quicksort(a,0,a.length-1); System.out.println(a); for(int i:a) System.out.print(i); System.out.print(" "); static void quicksort(int[] a, int lowerindex, int higherindex) int i = lowerindex; int j = higherindex; int pivot = a[lowerindex+(higherindex-lowerindex)/2]; while (i <= j) while (a[i] < pivot) i++; while (a[j] > pivot) j--; if (i <= j) int temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; if (lowerindex < j) quicksort(a, lowerindex, j); if (i < higherindex) quicksort(a, i, higherindex); GT Rekurzió 8

Ajánlott: https://users.itk.ppke.hu/~kami/oktatasi_anyagok/szakiranyu %20Tovabbkepzes/06/05_01_Rendez%E9sek_2.pdf Kérdések, feladatok Módosítsd az quicksort nevű alprogramot úgy, hogy csökkenő sorrendbe rendezze a tömb elemeit! Módosítsd az quicksort nevű alprogramot úgy, hogy minden meghívásakor megjelenítse paraméterként kapott tömbindexeket, a kiemelt tömbelem értékét, és a tömbelemek aktuális sorrendjét! Legalább 2 számsor esetén írd le füzetedbe az megjelenített adatokat áttekinthető formában és jelöld a változásokat. GT Rekurzió 9

Iteratív bináris keresés Rendezett tömbben nagyon gyors keresés tesz lehetővé. Megvizsgálja a tömb középső elemét. Három eset lehetséges: megtalálta a keresett elemet >> visszaadja indexét kisebb a kereset elemnél >> a tömbnek már csak az aktuális elemet követő részét vizsgálja nagyobb a kereset elemnél >> a tömbnek már csak az aktuális elemet megelőző részét vizsgálja Specifikáció: a: tömb(n) a rendezett tömb Elso,Utolso: egészek a vizsgált kerülő rész eleje és vége, bemenő paraméterek keresett: egész a keresett érték, bemenő paraméter Van: logikai cím szerint átadott paraméter Index: egész cím szerint átadott paraméter a kereset elem indexe -------------------------------------------------------------------------- Mondatszerű leírás: ciklus amíg első <= utolsó és van = hamis Középső := (Első + Utolsó) Div 2 Ha keresett = t[középső] akkor van := igaz index := középső ha Keresett < t[középső] akkor utolsó := Középső - 1 Ellenben Első := Középső + 1 Ha vége ciklus vége Pascal kód: Program BinarisKeresesPRG; const n = 5; type TmbTip = array[1..n] of integer; a: array[1..n] of integer = (-42,21,44,50,135); i, k, SORSZ: integer; OK : boolean; Procedure BinarisKereses(n:Integer; keresett:integer; Var a:tmbtip; Var Van:Boolean; Var Index:Integer); Elso,Utolso,Kozep:Integer; Elso:=1; Utolso:=n; Van:=false; while ((Elso<=Utolso) AND (Van=false)) do kozep:= (Elso+Utolso ) div 2; If keresett=a[kozep] then Van:=true; Index:=kozep; end If keresett<a[kozep] then Utolso:=kozep-1 Elso :=kozep+1; GT Rekurzió 10

BinarisKereses(n,135,a,OK,SORSZ); if (OK) then writeln('sorszám:',sorsz); for i:=1 to n do writeln(i,'. elem:',a[i]); -------------------------------------------------------------------------- Java kód: public static void main(string[] args) int[] a = -42,21,44,50,135; int index = BinarisKereses(a,a.length-1,44); System.out.println(a); for(int i:a) System.out.print(i); System.out.print(" "); System.out.println(" "); System.out.print(index); static int BinarisKereses(int[] a, int n, int keresett) int bal = 0; int jobb = n - 1; for(int kozep = (bal+jobb)/2; bal <= jobb; kozep = (bal+jobb)/2) if (a[kozep] == keresett) return kozep; if (keresett < a[kozep]) jobb = kozep - 1; bal = kozep + 1; return -1; GT Rekurzió 11

Rekurzív bináris keresés Ha a középső elem kisebb vagy nagyobb a keresettnél, akkor rekurzív hívásokkal vizsgáljuk a tömb mögötte vagy előtte található elemeit. Specifikáció: a: tömb(n) a rendezett tömb bal, jobb: egészek a vizsgált kerülő rész eleje és vége, bemenő paraméterek keresett: egész a keresett érték, bemenő paraméter visszatérési érték a keresett elem pozíciója, ha nem található, akkor -1 Mondatszerű leírás: Függvény RekurzivBinKer(a: tömb; keresett, bal, jobb: egész): egész Ha jobb < bal akkor RekurzivBinKer := -1 különben kozep := (bal + jobb) / 2; Ha (a[kozep] = keresett) akkor RekurzivBinKer := kozep különben Ha (keresett < a[kozep]) akkor RekurzivBinKer := RekurzivBinKer(a, keresett, bal, kozep 1) különben RekurzivBinKer := RekurzivBinKer(a, keresett, kozep + 1, jobb); Elágazás vége Elágazás vége Elágazás vége Függvény vége Pascal kód: Program BinarisKeresesPRG; const n = 5; type TmbTip = array[1..n] of integer; a: array[1..n] of integer = (-42,21,44,50,135); i, k, Index: integer; OK : boolean; function RekurzivBinKer(Var a:tmbtip; keresett, bal, jobb:integer): integer; kozep:integer; if (jobb < bal) then RekurzivBinKer := -1 kozep := (bal + jobb) div 2; if (a[kozep] = keresett) then RekurzivBinKer := kozep if (keresett < a[kozep]) then RekurzivBinKer := RekurzivBinKer(a, keresett, bal, kozep - 1) RekurzivBinKer := RekurzivBinKer(a, keresett, kozep + 1, jobb); Index := RekurzivBinKer(a,135,0,n); if Index>-1 then writeln('sorszám:',index) writeln('nincs'); for i:=1 to n do writeln(i,'. elem:',a[i]); GT Rekurzió 12

Java kód: public static void main(string[] args) int[] a = -42,21,44,50,135; int index = RekurzivBinKer(a,50,0,a.length-1); System.out.println(a); for(int i:a) System.out.print(i); System.out.print(" "); System.out.println(" "); System.out.print(index); static int RekurzivBinKer(int[] a, int keresett, int bal, int jobb) if (jobb < bal) return -1; int kozep = (bal + jobb) / 2; if (a[kozep] == keresett) return kozep; if (keresett < a[kozep]) return RekurzivBinKer(a, keresett, bal, kozep - 1); return RekurzivBinKer(a, keresett, kozep + 1, jobb); GT Rekurzió 13

Hanoi-tornyai A játék szabályai szerint az első rúdról az utolsóra kell átrakni a korongokat úgy, hogy minden lépésben egy korongot lehet áttenni, nagyobb korong nem tehető kisebb korongra, és ehhez összesen három rúd áll rendelkezésre. Specifikáció: n: korong(ok) száma Forras: melyik pálcáról kell, hogy átrakjuk a korongokat Cel: melyik pálcára kell, hogy átrakjuk a korongokat Seged: melyik pálca segítségével rakjuk át a korongokat Mondatszerű leírás: Eljárás Hanoi(n, Forras, Cel, Seged) Ha n > 0 akkor Hanoi(n-1, Forras, Seged, Cel) KI: n korongot Forras > Cel Ha n > 0 akkor Hanoi(n-1, Seged, Cel, Forras) Eljárás vége program HanoiPrg; Procedure Hanoi(n,Forras,Seged,Cel:integer); Begin if n>0 then Hanoi(n-1,Forras,Cel,Seged); Writeln(n,'. korongot ',Forras,'. rúdról ',Cel,'. rúdra!'); if (n > 1) then Hanoi(n-1,Seged,Cel,Forras); End; Hanoi(3,1,2,3); program HanoiPrg; procedure Hanoi(i, n: integer; Forras, Cel, Seged: char); i:=i+1; writeln('i:',i,' n:',n,' Forras:', Forras, ' Cel:', Cel, ' Seged:',Seged); if n > 0 then ha van korong Hanoi(i,n-1, Forras, Seged, Cel); n-1 -et a 'tanitvany' átrak a Seged-re writeln(n:2,'. ',Forras,'->',Cel); helyere rakjuk az felsőt Hanoi(i,n-1, Seged, Cel, forras); a 'tanitvany' a Seged-ről a helyére tesz end Hanoi(0,3,'A','B','C'); GT Rekurzió 14

Hanoi-tornyai Hanoi-tornyai játék rúdjaira mindig csak felülről helyezhetünk új korongokat, és csak a legfelsőt tudjuk leemelni. Ez a megfelel a verem memóriák működésének. A következő program minden rúdhoz egy rekordot rendel, amiben külön mező tárolja a veremmutató értékét, a másik mezőben található tömb pedig a benne elhelyezett korongok sorszámát. A Push eljárás az adott verem tetejére helyezi a paraméterben kapott sorszámot, és növeli a veremmutatót, ha még nem értük el a verem tetejét. A Pop függvény az adott verem tetejéről leveszi az ott található sorszámot, és csökkenti a veremmutatót, feltéve ha verem nem üres. program HanoiVerem; const db = 4; type VeremT=Record Mut:integer; Elemek:array[1..db] of integer; AVerem, BVerem, CVerem: VeremT; procedure InitVermek; i : integer; Averem.Mut := db; Bverem.Mut := 0; Cverem.Mut := 0; for i:=1 to db do Averem.Elemek[i] := i; Bverem.Elemek[i] := 0; Cverem.Elemek[i] := 0; procedure PushA (n:integer); if Averem.Mut<db+1 then Averem.Mut := Averem.Mut + 1; Averem.Elemek[Averem.Mut] := n; function PopA: integer; if Averem.Mut>0 then PopA := Averem.Elemek[Averem.Mut]; Averem.Elemek[Averem.Mut] := 0; Averem.Mut := Averem.Mut - 1; end PopA := 0; GT Rekurzió 15

procedure KiirAverem; i : integer; for i:= 1 to db do write(averem.elemek[i]); writeln(); procedure PushB (n:integer); if Bverem.Mut<db+1 then Bverem.Mut := Bverem.Mut + 1; Bverem.Elemek[Bverem.Mut] := n; function PopB: integer; if Bverem.Mut>0 then PopB := Bverem.Elemek[Bverem.Mut]; Bverem.Elemek[Bverem.Mut] := 0; Bverem.Mut := Bverem.Mut - 1; end PopB := 0; procedure KiirBverem; i : integer; for i:= 1 to db do write(bverem.elemek[i]); writeln(); procedure PushC (n:integer); if Cverem.Mut<db+1 then Cverem.Mut := Cverem.Mut + 1; Cverem.Elemek[Cverem.Mut] := n; function PopC: integer; if Cverem.Mut>0 then PopC := Cverem.Elemek[Cverem.Mut]; Cverem.Elemek[Cverem.Mut] := 0; Cverem.Mut := Cverem.Mut - 1; end PopC := 0; procedure KiirCverem; i : integer; for i:= 1 to db do write(cverem.elemek[i]); writeln(); procedure Atrak(Forras, Cel:char); n:integer; Case Forras of 'A' : n := PopA; 'B' : n := PopB; GT Rekurzió 16

'C' : n := PopC; Case Cel of 'A' : PushA(n); 'B' : PushB(n); 'C' : PushC(n); writeln('átrak ', Forras, '(',n,') >', Cel); KiirAverem; KiirBverem; KiirCverem; writeln(); procedure Hanoi(i, n: integer; Forras, Cel, Seged: char); i:=i+1; writeln('i:',i,' n:',n,' Forras:', Forras, ' Cel:', Cel, ' Seged:',Seged); if n > 0 then ha van korong Hanoi(i,n-1, Forras, Seged, Cel); Atrak(Forras, Cel); Hanoi(i,n-1, Seged, Cel, forras); end InitVermek; KiirAverem; Hanoi(0,db,'A','B','C','D'); KiirAverem; KiirBverem; KiirCverem; Kérdések, feladatok Próbáld ki a HanoiVerem nevű programot! Ellenőrizd működését 3,4 és 5 korong esetén! Készítsd el a verem memóriákat kezelő alprogramok mondatszerű leírásait! GT Rekurzió 17