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

Hasonló dokumentumok
Információs Technológia

A programozás alapjai 1 Rekurzió

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

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

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

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

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

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

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

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 C nyelven (13. ELŐADÁS) Sapientia EMTE

2018, Diszkrét matematika

INFORMATIKA javítókulcs 2016

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

Programozás C nyelven (10. ELŐADÁS) Sapientia EMTE

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

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

2018, Funkcionális programozás

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

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

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

Rekurzív algoritmusok

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

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

2016, Diszkrét matematika

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

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

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

Felvételi tematika INFORMATIKA

9.fejezet: Függvények és külső eljárások

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

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

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

ISA szimulátor objektum-orientált modell (C++)

Rekurzió. Dr. Iványi Péter

2015, Diszkrét matematika

2018, Diszkre t matematika. 10. elo ada s

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Pénzügyi algoritmusok

Programozás C++ -ban 2007/7

Programozás C++ -ban

Bevezetés a programozásba I.

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

Programozási nyelvek Java

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

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

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

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

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

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Objektumok inicializálása

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

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

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

Programozási Nyelvek: C++

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

Elıírt lépésszámú ciklusok

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

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

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

2016, Diszkrét matematika

... fi. ... fk. 6. Fabejáró algoritmusok Rekurzív preorder bejárás (elsőfiú-testvér ábrázolásra)

értékel függvény: rátermettségi függvény (tness function)

1. Alapok. Programozás II

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

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

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

A 2015/2016 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

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

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

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

Apple Swift kurzus 3. gyakorlat

Mintavételes szabályozás mikrovezérlő segítségével

Globális operátor overloading

INFORMATIKA tétel 2019

Bevezetés a programozásba. 11. Előadás: Esettanulmány

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

2016, Diszkrét matematika

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

3. Osztályok II. Programozás II

Algoritmusok pszeudókód... 1

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

6. fejezet: Ciklusok

Tartalomjegyzék Algoritmusok - pszeudókód

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

C++ programozási nyelv Konstruktorok-destruktorok

Programozás Minta programterv a 2. házi feladathoz 1.

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

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

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

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Informatika terméktervezőknek

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Programozás C nyelven (10a. 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:

Kivételek, kivételkezelés a C++ nyelvben

Adatszerkezetek 7a. Dr. IványiPéter

Programozás II. 2. Dr. Iványi Péter

Objektumorientált Programozás VI.

Objektum Orientált Programozás VII.

Átírás:

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

ELJÁRÁSOK: void-függvények Olvassu k be szá ot a bille tyűzetről, és írassuk ki a égyzeteiket a képer yőre. int main(){ int n, i, szam; cin >> n; for( i=1 ; i <= n ; ++i){ cin >> szam; cout << szam*szam << \n ; return 0; 3 7 49 11 121 5 25 _

ELJÁRÁSOK: void-függvények void be_szamsor_ki_negyzetsor(int); int main(){ int n; cin >> n; be_szamsor_ki_negyzetsor(n); return 0; void be_szamsor_ki_negyzetsor(int db){ int i, szam; for( i=1 ; i <= db ; ++i){ cin >> szam; cout << szam*szam << \n ; 3 7 49 11 121 5 25 _

ISMÉTLÉS: iteratív vs. rekurzív PÉLDÁNYOK Kiosztott feladatok 1. 5 fát! 2. 4 fát! 3. 3 fát! 4. 2 fát! 5. 1 fát!

ISMÉTLÉS: iteratív vs. rekurzív Ha egy függvény azt a feladatot kapja, hogy is ételte végezze el bizo yos űveleteket, akkor két variáns közül választhat: Ciklus révén felvállalja a sokszori végrehajtást (iteratív módszer); Csak egyszeri végrehajtást vállal fel, és a többit átruházza egy kló jára rekurzív ódszer. átruházza egy kló jára meghívja önmagát

MIÉRT? Hanoi tornyai: iteratív vs. rekurzív void movedisksbetweentwopoles(struct Stack *src, struct Stack *dest, char s, char d){ int pole1topdisk = pop(src); int pole2topdisk = pop(dest); void tohiterative(int num_of_disks, struct Stack *src, struct Stack *aux, struct Stack *dest){ if (pole1topdisk == INT_MIN){ int i, total_num_of_moves; push(src, pole2topdisk); char s = 'S', d = 'D', a = 'A'; pole2topdisk); void move(int n, int from, int movedisk(d, to, int s,via){ if (num_of_disks % 2 == 0){ if (n > 0) { char temp = d; else if (pole2topdisk == INT_MIN){ d = a; move(n - 1, from, via,push(dest, to); pole1topdisk); a = temp; d, pole1topdisk); cout << from <<, <<movedisk(s, to << \n ; move(n from); total_num_of_moves = pow(2, num_of_disks) - 1; - 1, via, to, else if (pole1topdisk > pole2topdisk){ for (i = num_of_disks; i >= 1; i--) push(src, pole1topdisk); ELEGÁNS push(src, i); push(src, pole2topdisk); for (i = 1; i <= total_num_of_moves; i++){ movedisk(d, s, pole2topdisk); if (i % 3 == 1) movedisksbetweentwopoles(src, dest, s, d); else{ else if (i % 3 == 2) push(dest, pole2topdisk); movedisksbetweentwopoles(src, aux, s, a); push(dest, pole1topdisk); else if (i % 3 == 0) movedisk(s, d, pole1topdisk); movedisksbetweentwopoles(aux, dest, a, d); NEHÉZKES

Ültess fákat: iteratív Hányszor hívódik meg a függvény void ultess_fakat(int); int main(){ int n; cin >> n; ultess_fakat(n); return 0; void ultess_fakat(int db){ int i; for( i=1 ; i <= db ; ++i){ <ültess el egy fát> Hány db/i nek történik helyfoglalás

Ültess fákat: rekurzív Hányszor hívódik meg a függvény void ultess_fakat(int); int main(){ 1. 2. int n; 5 cin >> n; 4 ultess_fakat(n); return 0; void ultess_fakat(int db){ if (db > 1){ <ültess el egy fát> ultess_fakat(db-1); else {<ültess el egy fát> 3. 3 4. 2 Hány db nek történik helyfoglalás 5. 1

Rekurzív eljárások: SÉMA (1) void R_E(<kapott_feladat_paraméterei>){ if (<kapott_feladat_nem_triviális>){ <old_meg_a_felvállalt_saját_részt> Rekurzív-ág R_E(<átruházott_feladat_paraméterei>); Hasonló, else { egyszerűbb; Triviális-ág <old_meg_a_triviális_feladatot> konvergál a triviális feladathoz 1. 5 2. 4 3. 3 4. 2 5. 1 Melyik példány ültet először fát?

Rekurzív eljárások: SÉMA (2) void R_E(<kapott_feladat_paraméterei>){ if (<kapott_feladat_nem_triviális>){ R_E(<átruházott_feladat_paraméterei>); <old_meg_a_felvállalt_saját_részt> else { <old_meg_a_triviális_feladatot> 1. 5 2. 4 3. 3 4. 2 5. 1 Melyik példány ültet először fát?

Rekurzív void-függvények (1) 3 void REKURZIV_be_szamsor_ki_negyzetsor(int); 7 int main(){ 49 int n; 11 cin >> n; 121 REKURZIV_be_szamsor_ki_negyzetsor(n); 5 25 return 0; _ void REKURZIV_be_szamsor_ki_negyzetsor(int db){ int szam; Hány db/szam nak történik helyfoglalás Hányszor if (db > 1){ hívódik cin >> szam; cout << szam*szam << \n ; meg a REKURZIV_be_szamsor_ki_negyzetsor(db-1); függvény else { 1. 2. 3. cin >> szam; db szam cout << szam*szam << \n ; db szam 3 7 db szam 2 11 1 5

Rekurzív void-függvények (2) 3 7 11 5 25 121 49 _ void REKURZIV_be_szamsor_ki_negyzetsor(int); int main(){ int n; cin >> n; REKURZIV_be_szamsor_ki_negyzetsor(n); return 0; void REKURZIV_be_szamsor_ki_negyzetsor(int db){ int szam; if (db > 1){ cin >> szam; REKURZIV_be_szamsor_ki_negyzetsor(db-1); cout << szam*szam << \n ; else { 1. 2. 3. cin >> szam; cout << szam*szam << \n ; db szam db szam 3 7 db szam 2 11 1 5

Rekurzív void-függvények (3) void REKURZIV_be_szamsor_ki_negyzetsor(int); 3 int main(){ 7 int n; 49 11 cin >> n; 121 REKURZIV_be_szamsor_ki_negyzetsor(n); 5 return 0; 25 _ void REKURZIV_be_szamsor_ki_negyzetsor(int db){ int szam; Hány db/szam nak Hányszor if (db > 0){ történik helyfoglalás hívódik cin >> szam; cout << szam*szam << \n ; meg a REKURZIV_be_szamsor_ki_negyzetsor(db-1); függvény 1. 2. 3. 4. else {; db szam 3 7 db szam 2 11 db szam 1 5 db szam 0?

Rekurzív valódi-függvények (1) Írj rekurzív függvényt, amely visszatéríti a paraméterként kapott természetes szám számjegyei szorzatát! 1. KÉRDÉS: Hogyan vezethető vissza a feladat hasonló, egyszerűbb részfeladatra? x számjegyszorzata (52437) x/10 számjegyszorzata (5243)

Rekurzív valódi-függvények (2) Írj rekurzív függvényt, amely visszatéríti a paraméterként kapott természetes szám számjegyei szorzatát! 2. KÉRDÉS: Mikor tekintem úgy, hogy a feladat triviálissá redukálódott? Ha elfogyott a szám (52437) (5243) (524) (52) (5) ()

Rekurzív valódi-függvények (3) Írj rekurzív függvényt, amely visszatéríti a paraméterként kapott természetes szám számjegyei szorzatát! int szamjegyszorzat(int x){ if (x > 0){ Rekurzív-ág ooo Triviális-ág else{ ooo

Rekurzív valódi-függvények (4) Írj rekurzív függvényt, amely visszatéríti a paraméterként kapott természetes szám számjegyei szorzatát! int szamjegyszorzat(int x){ if (x > 0){ ooo Triviális részfeladat else{ return 1; nyilvánvaló megoldásának return-elése

Rekurzív valódi-függvények (5) Írj rekurzív függvényt, amely visszatéríti a paraméterként kapott természetes szám számjegyei szorzatát! int szamjegyszorzat(int x){ if (x > 0){ int t = szamjegyszorzat(x/10); ooo Rekurzív hívás révén kérem tálcán az else{ return 1; átruházott rész megoldását

Rekurzív valódi-függvények (6) Írj rekurzív függvényt, amely visszatéríti a paraméterként kapott természetes szám számjegyei szorzatát! int szamjegyszorzat(int x){ if (x > 0){ int t = szamjegyszorzat(x/10); return t * x%10; A bevállalt szorzás else{ return 1;

Rekurzív valódi-függvények int szamjegyszorzat(int); int main(){ 324 int szam; 24_ cin >> szam; cout << szamjegyszorzat(szam); return 0; int szamjegyszorzat(int x){ if (x > 0){ 1. int t = szamjegyszorzat(x/10); x t return t * x%10; 324 324? else{ return 1; 32 24 324 6 * * 2. 3. x t 32? 3 32 3 6 4. * x t 3? 0 0 3 3 1 * x 1

Összefoglalás (1) Mi de jele tősebb feladat egoldása részfeladatok ismételt elvégzését feltételezi. Ha ciklus-utasítás révén valósítjuk meg az ismétlést, akkor iteratív implementációról beszélünk. Egy ásik lehetőség a rekurzív egvalósítás. A rekurzív eljárások/függvények sajátossága, hogy meghívják önmagukat. Olyan, mintha klónoznának magukból további példányokat. Úgy is mondhatnánk, hogy a rekurzivitás mechanizmusa révé, az illető eljárásból/függvé yből példá yok sora jö létre, amelyek között szétosztódik a megoldandó feladat.

Összefoglalás (2) Mindegyik példány bevállal egy adott részt a kapott feladatból, a maradék részfeladatot pedig egy következő példá yra ruházza át. Mivel az átruházás egy klónra történik, ezért a kapott feladatnak és az átruházott részfeladatnak hasonlónak kell lennie. A rekurzív implementálás kulcskérdése tehát az, hogy iké t vezethető vissza a kapott feladat egoldása haso ló, egyre egyszerűbb részfeladatok egoldására. E redukálási folya at révé végül a yira leegyszerűsödik a feladat, hogy a sorvégi példány egészében be tudja vállalni.

Összefoglalás (3) Minden eljárás/függvény-példány hasonló feladatot kap, hogy megoldjon; A kapott feladat éretétől függ, hogy a kurre s példány rekurzívan fog viselkedni, vagy bevállalja a teljes megoldást; Rekurzívan viselkedni azt jelenti, hogy önmaga meghívása által, a kapott feladat oroszlánrészét haso ló, egyszerűbb részfeladatot átruházza egy következő példá yra a fe aradt részt bevállalja ; Egyszerűsített, általá os forgatókö yv a kurre s példányra megfogalmazva:

Gyakori hibák (ID)

Gyakori hibák (ID)

Gyakori hibák (ID)

Gyakori hibák (ID)

Gyakori hibák (ID)

Gyakori hibák (ID)

Gyakori hibák (ID)

Gyakori hibák (ID)