A programozás alapjai 1 Rekurzió

Hasonló dokumentumok
Információs Technológia

Rekurzív algoritmusok

Rekurzió. Dr. Iványi Péter

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Információs Technológia

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Programozás I. 5. Előadás: Függvények

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Adatbázis rendszerek Gy: Algoritmusok C-ben

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

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

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)

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

A C programozási nyelv II. Utasítások. A függvény.

Nagy HF u tmutato 2011/2012 II. fe le v

Adatszerkezetek 7a. Dr. IványiPéter

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

5. Gyakorlat. struct diak {

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

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

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

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

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

Körkörös listák. fej. utolsó. utolsó. fej

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

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

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

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

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

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

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Felvételi tematika INFORMATIKA

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

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

és az instanceof operátor

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

INFORMATIKA javítókulcs 2016

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás C és C++ -ban

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

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

Adatszerkezetek és algoritmusok

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

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

C programozási nyelv

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Bevezetés a C++ programozási nyelvbe

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

2018, Funkcionális programozás

Függvények int, long 1. Adott a mellékelt f alprogram.

Programozási segédlet

Alprogramok, paraméterátadás

Java II. I A Java programozási nyelv alapelemei

A C programozási nyelv III. Pointerek és tömbök.

Bevezetés a programozásba. 8. Előadás: Függvények 2.

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A szemantikus elemzés elmélete. Szemantikus elemzés (attribútum fordítási grammatikák) A szemantikus elemzés elmélete. A szemantikus elemzés elmélete

Webprogramozás szakkör

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

3. Osztályok II. Programozás II

A C programozási nyelv III. Pointerek és tömbök.

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

Java II. I A Java programozási nyelv alapelemei

Occam 1. Készítette: Szabó Éva

Vezérlési szerkezetek

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

Programozás I gyakorlat. 10. Stringek, mutatók

Algoritmusok pszeudókód... 1

C++ programozási nyelv

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.

Pénzügyi algoritmusok

Programozás C nyelven 6. ELŐADÁS. Sapientia EMTE

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

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Algoritmusok pszeudókód... 1

Tartalomjegyzék Algoritmusok - pszeudókód

Kiegészítő előadás. Vizsgabemutató VBA. Dr. Kallós Gábor, Fehérvári Arnold, Pusztai Pál Krankovits Melinda. Széchenyi István Egyetem

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

Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás

Kivételkezelés a C++ nyelvben Bevezetés

Eljárások és függvények

Programozás alapjai 9.Gy: Struktúra 2.

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

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

Kifejezések. A programozás alapjai előadás. Operátorok. Kifejezések. Operátorok precedenciája. Operátorok precedenciája

2015, Diszkrét matematika

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

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

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

Láncolt lista. az itt adott nevet csak a struct deklaráción belül használjuk

Bevezetés, a C++ osztályok. Pere László

8. gyakorlat Pointerek, dinamikus memóriakezelés

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Alprogramok fordítása. Kódgenerálás II. (alprogramok, memóriakezelés) Függvény, eljárás. Alprogramok írása assemblyben

Átírás:

A programozás alapjai Rekurzió. előadás Híradástechnikai Tanszék - preorder (gyökér bal gyerek jobb gyerek) mentés - visszaállítás - inorder (bal gyerek gyökér jobb gyerek) rendezés 4 5 6 4 6 7 5 7 - posztorder (bal gyerek jobb gyerek gyökér) képlet kiértékelése 7 4 6 5 typedef adat; typedef stuct fa { adat a; struct fa *b,*j; faelem; void feldolgoz (adat d) {

- preorder void bejar(faelem *p) void bejar(faelem *p) { { if (p) feldolgoz(p->a); { if (p->b) bejar(p->b); feldolgoz(p->a); if (p->j) bejar(p->j); bejar(p->b); bejar(p->j); - inorder void bejar(faelem *p) void bejar(faelem *p) { { if (p) if (p->b) bejar(p->b); { feldolgoz(p->a); bejar(p->b); if (p->j) bejar(p->j); feldolgoz(p->a); bejar(p->j); - posztorder void bejar(faelem *p) void bejar(faelem *p) { { if (p) if (p->b) bejar(p->b); { if (p->j) bejar(p->j); bejar(p->b); feldolgoz(p->a); bejar(p->j); feldolgoz(p->a); Közvetlen rekurzió: egy szegmens hivatkozik önmagára Közvetett rekurzió: szegmensek egymásra hivatkozásaiban kör van A rekurzió célja: A feladat méretének, vagy bonyolultságának csökkentése egy kezelhető szintig.

A rekurzió kritikus pontja: A leállás feltételének teljesülését minden esetben biztosítani kell. A rekurzió nagy előnye az elegancia Néhány sorban, könnyen érthető kódot írhatunk. A rekurzió nagy hátránya a csábítás Akkor is használjuk, ha kevéssé hatékony, sőt pazarló. Mikor ne használjunk rekurziót? Ha az eredmény zárt alakban is előállítható. Pl.: számtani sorozat n-edik eleme Ha a feladat ciklusszervezéssel is könnyen megoldható. Pl.: faktoriális számítás A rekurzió és a ciklus kapcsolata Minden ciklus megvalósítható rekurzióval. Minden rekurzió megvalósítható ciklussal és segédváltozókkal. Minden ciklus megvalósítható rekurzióval. A B C Vége A B C A Vége

Minden rekurzió megvalósítható ciklussal és segédváltozókkal. Egy könnyű probléma: A Fibonacci számsorozat A megoldásra rátalálni néha nem könnyű feladat! 5 8 4 55 Lássunk példát erre is, arra is! A sorozat harmadik elemétől kezdve minden elem az előző kettő összege. A Fibonacci számsorozat Rekurzív megvalósítás fib(unsigned n) { if (n<) return n; return fib(n-) + fib(n-); A Fibonacci számsorozat Megvalósítás ciklussal fib(unsigned n) { int regi=,uj=; for(n--;n;n--) { uj+=regi; regi=uj-regi; return uj; Egy nehéz probléma: Hanoi tornyai A MESE Hanoi tornyai Rekurzív megvalósítás void hanoi(unsigned hanyat, char honnan,char hova) { char seged=* B -honnan-hova; if (--hanyat) hanoi(hanyat,honnan,seged); printf( %c %c\n,honnan,hova); if (hanyat) hanoi(hanyat,seged,hova); 4

4 Hanoi tornyai Megvalósítás ciklussal? 4 4 4 5 6 7 8 9 4 5 5

6

A páratlan lépéseket a legkisebb koronggal tesszük meg, mindig ugyanarra. A párosadik lépések is egyértelműen meghatározottak: - Tudjuk, hogy merre kell lépni. - Amivel léptünk, azzal nem léphetünk. - A legkisebb korongra nem rakodhatunk. Hanoi tornyai Megvalósítás ciklussal - Ha n korong van, n - lépés kell. - Minden páratlanadik lépést a legkisebb koronggal kell megtenni. - Ha n páratlan, A-B-C-A sorrendben lép, ha n páros, A-C-B-A sorrendben lép. - Ha a következő lépést ugyanarra kell megtenni, oda kell lépni, ahonnan léptünk. - Ha a következő lépést ellenkező irányban kell megtenni, onnan kell lépni, ahonnan léptünk. Hogyan lehet megvalósítani a rekurziót? Hogyan lehet megvalósítani, hogy a függvénynek egyszerre több példánya éljen? Ezt már tudjuk! 7

A nagy ÖTLET: CSAK EGY VEREM KELL! Kalkulátor verem = ahol a kifejezések kiértékelése történik Hívás verem = ahol a visszatérési címet tároljuk Paraméter verem = ahol a paramétereket adjuk át Ha már lúd, legyen kövér! Tároljuk itt a szegmensek belső változóit is! Mit kell tudnia a függvényről a fordítóprogramnak, hogy meg tudja hívni? azonosítóját a megvalósító szubrutin címét paraméterezését az átadandó paraméterek típusát Ez képezi a függvény deklarációját Mit nem szükséges tudnia a függvényről a fordítóprogramnak, hogy meg tudja hívni? 8

megvalósítását az végrehajtandó utasításokat Ez képezi a függvény definícióját Hogyan definiálunk függvényt? Ezt is tudjuk! Függvény definíciója <visszatérési érték típusa> <függvény azonosítója> (<formális paraméterek listája>) <blokk> A közvetlen rekurzióhoz ez több mint elég! 9

Közvetlen rekurzió: egy szegmens hivatkozik önmagára De mi a helyzet a közvetett rekurzióval? Közvetett rekurzió: szegmensek egymásra hivatkozásaiban kör van Ez a tyúk vagy a tojás esete! Függvény definíciója Megoldás: Válasszuk szét a függvény deklarációját és definícióját! <visszatérési érték típusa> <függvény azonosítója> (<formális paraméterek listája>) <blokk>

Függvény deklarációja <visszatérési érték típusa> <függvény azonosítója> (<paraméterek listája>) ; A blokk helyén ; áll. Függvény deklarációja <visszatérési érték típusa> <függvény azonosítója> (<paraméterek listája>) ; A paraméterek nevét a fordítóprogram nem veszi figyelembe, ezért elhagyható, vagy tetszőleges nevet használhatunk. A függvény deklarációja minden a híváshoz szükséges információt tartalmaz. A függvény prototípusának is nevezzük. Másként a függvény fejléce. A függvények tetszőleges sorrendben hívhatják egymást, ha a fejléceket kigyűjtjük, és a kód elejére írjuk. Jó szokás egy fájlba írni, és #include direktívával hivatkozni rá.