85
HIKGHB Németh Gábor LUF9NV Simon

HIKGHB Németh Gábor LUF9NV Simon Attila

  • Upload
    emmett

  • View
    34

  • Download
    0

Embed Size (px)

DESCRIPTION

HÁZI FELADAT. HIKGHB Németh Gábor LUF9NV Simon Attila. A programozás al apjai 1. 10. előadás. Híradástechnikai Tanszék. Rekurzió. 1. 5. 2. 7. 6. 4. 3. Bináris fa bejárása - preorder (gyökér – bal gyerek – jobb gyerek) mentés - visszaállítás. 4. 6. 2. 7. 5. 3. 1. - PowerPoint PPT Presentation

Citation preview

Page 1: HIKGHB Németh Gábor LUF9NV Simon Attila

HIKGHB Németh Gábor

LUF9NV Simon Attila

Page 2: HIKGHB Németh Gábor LUF9NV Simon Attila

A programozás alapjai 1

10. előadás

Híradástechnikai Tanszék

Page 3: HIKGHB Németh Gábor LUF9NV Simon Attila

Rekurzió

Page 4: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

- preorder

(gyökér – bal gyerek – jobb gyerek) mentés - visszaállítás

1

52

7643

Page 5: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

- inorder

(bal gyerek – gyökér – jobb gyerek) rendezés

4

62

7531

Page 6: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

- posztorder

(bal gyerek – jobb gyerek – gyökér) képlet kiértékelése

7

63

5421

Page 7: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

typedef … adat; typedef stuct fa {

adat a; struct fa *b,*j;

} faelem; void feldolgoz (adat d) { … }

Page 8: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

- 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); } }

Page 9: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

- 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); } }

Page 10: HIKGHB Németh Gábor LUF9NV Simon Attila

Bináris fa bejárása

- 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); } }

Page 11: HIKGHB Németh Gábor LUF9NV Simon Attila

Közvetlen rekurzió:

egy szegmens hivatkozik önmagára

Page 12: HIKGHB Németh Gábor LUF9NV Simon Attila

Közvetett rekurzió:

szegmensek egymásra hivatkozásaiban kör van

Page 13: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió célja:

Page 14: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió célja:

A feladat méretének, vagy bonyolultságának csökkentése egy kezelhető szintig.

Page 15: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió kritikus pontja:

Page 16: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió kritikus pontja:

A leállás feltételének teljesülését minden esetben biztosítani kell.

Page 17: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió nagy előnye

Page 18: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió nagy előnyeaz elegancia

Page 19: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió nagy előnyeaz elegancia

Néhány sorban,könnyen érthetőkódot írhatunk.

Page 20: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió nagy hátránya

Page 21: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió nagy hátrányaa csábítás

Page 22: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió nagy hátrányaa csábítás

Akkor is használjuk,ha kevéssé hatékony,

sőt pazarló.

Page 23: HIKGHB Németh Gábor LUF9NV Simon Attila

Mikor ne használjunk rekurziót?

Page 24: HIKGHB Németh Gábor LUF9NV Simon Attila

Mikor ne használjunk rekurziót?

Ha az eredmény zárt alakban is előállítható.

Page 25: HIKGHB Németh Gábor LUF9NV Simon Attila

Mikor ne használjunk rekurziót?

Ha az eredmény zárt alakban is előállítható. Pl.: számtani sorozat n-edik eleme

Page 26: HIKGHB Németh Gábor LUF9NV Simon Attila

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

Page 27: HIKGHB Németh Gábor LUF9NV Simon Attila

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

Page 28: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió és a ciklus kapcsolata

Page 29: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió és a ciklus kapcsolata

Minden ciklus megvalósítható rekurzióval.

Page 30: HIKGHB Németh Gábor LUF9NV Simon Attila

A rekurzió és a ciklus kapcsolata

Minden ciklus megvalósítható rekurzióval.

Minden rekurzió megvalósítható ciklussal és segédváltozókkal.

Page 31: HIKGHB Németh Gábor LUF9NV Simon Attila

Minden ciklus megvalósítható rekurzióval.

A

C

B

Vége

A

B

C

Vége

A

Page 32: HIKGHB Németh Gábor LUF9NV Simon Attila

Minden rekurzió megvalósítható ciklussal és segédváltozókkal.

Page 33: HIKGHB Németh Gábor LUF9NV Simon Attila

Minden rekurzió megvalósítható ciklussal és segédváltozókkal.

A megoldásra rátalálninéha nem könnyű feladat!

Page 34: HIKGHB Németh Gábor LUF9NV Simon Attila

Minden rekurzió megvalósítható ciklussal és segédváltozókkal.

A megoldásra rátalálninéha nem könnyű feladat!

Lássunk példát erre is, arra is!

Page 35: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy könnyű probléma:

Page 36: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy könnyű probléma:

A Fibonacci számsorozat

Page 37: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy könnyű probléma:

A Fibonacci számsorozat

1 1 2 3 5 8 13 21 34 55 …

Page 38: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy könnyű probléma:

A Fibonacci számsorozat

1 1 2 3 5 8 13 21 34 55 …

A sorozat harmadik elemétől kezdveminden elem az előző kettő összege.

Page 39: HIKGHB Németh Gábor LUF9NV Simon Attila

A Fibonacci számsorozat

Rekurzív megvalósítás

fib(unsigned n){ if (n<2) return n; return fib(n-2) + fib(n-1);}

Page 40: HIKGHB Németh Gábor LUF9NV Simon Attila

A Fibonacci számsorozat

Megvalósítás ciklussal

fib(unsigned n){ int regi=0,uj=1; for(n--;n;n--) { uj+=regi; regi=uj-regi;} return uj;}

Page 41: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy nehéz probléma:

Page 42: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy nehéz probléma:

Hanoi tornyai

Page 43: HIKGHB Németh Gábor LUF9NV Simon Attila

Egy nehéz probléma:

Hanoi tornyai

A MESE

Page 44: HIKGHB Németh Gábor LUF9NV Simon Attila

Hanoi tornyai

Rekurzív megvalósítás

void hanoi(unsigned hanyat, char honnan,char hova){char seged=3*′B′-honnan-hova;if (--hanyat) hanoi(hanyat,honnan,seged);printf(″%c %c\n″,honnan,hova);if (hanyat) hanoi(hanyat,seged,hova);}

Page 45: HIKGHB Németh Gábor LUF9NV Simon Attila

4 A B 3 A C 2 A B 1 A C

1 A B

1 C B

1 A C

2 B C 1 B A

1 B C

1 A C

1 A B

3 C B 2 C A 1 C B

1 C A

1 B A

1 C B

2 A B 1 A C

1 A B

1 C B

Page 46: HIKGHB Németh Gábor LUF9NV Simon Attila

Hanoi tornyai

Megvalósítás ciklussal

?

Page 47: HIKGHB Németh Gábor LUF9NV Simon Attila

4 A B 3 A C 2 A B 1 A C

1 A B

1 C B

1 A C

2 B C 1 B A

1 B C

1 A C

1 A B

3 C B 2 C A 1 C B

1 C A

1 B A

1 C B

2 A B 1 A C

1 A B

1 C B

Page 48: HIKGHB Németh Gábor LUF9NV Simon Attila

4 A B 3 A C 2 A B 1 A C

1 A B

1 C B

1 A C

2 B C 1 B A

1 B C

1 A C

1 A B

3 C B 2 C A 1 C B

1 C A

1 B A

1 C B

2 A B 1 A C

1 A B

1 C B

Page 49: HIKGHB Németh Gábor LUF9NV Simon Attila

A C

A B

C B

A C

B A

B C

A C

A B

C B

C A

B A

C B

A C

A B

C B

Page 50: HIKGHB Németh Gábor LUF9NV Simon Attila

1 A C

2 A B

3 C B

4 A C

5 B A

6 B C

7 A C

8 A B

9 C B

10 C A

11 B A

12 C B

13 A C

14 A B

15 C B

Page 51: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C

0010 A B

0011 C B

0100 A C

0101 B A

0110 B C

0111 A C

1000 A B

1001 C B

1010 C A

1011 B A

1100 C B

1101 A C

1110 A B

1111 C B

Page 52: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C 0

0010 A B 1

0011 C B 0

0100 A C 2

0101 B A 0

0110 B C 1

0111 A C 0

1000 A B 3

1001 C B 0

1010 C A 1

1011 B A 0

1100 C B 2

1101 A C 0

1110 A B 1

1111 C B 0

Page 53: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C 0

0010 A B 1

0011 C B 0

0100 A C 2

0101 B A 0

0110 B C 1

0111 A C 0

1000 A B 3

1001 C B 0

1010 C A 1

1011 B A 0

1100 C B 2

1101 A C 0

1110 A B 1

1111 C B 0

Page 54: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C 0

0010 A B 1

0011 C B 0

0100 A C 2

0101 B A 0

0110 B C 1

0111 A C 0

1000 A B 3

1001 C B 0

1010 C A 1

1011 B A 0

1100 C B 2

1101 A C 0

1110 A B 1

1111 C B 0

Page 55: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C 0

0010 A B 1

0011 C B 0

0100 A C 2

0101 B A 0

0110 B C 1

0111 A C 0

1000 A B 3

1001 C B 0

1010 C A 1

1011 B A 0

1100 C B 2

1101 A C 0

1110 A B 1

1111 C B 0

Page 56: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C 0

0010 A B 1

0011 C B 0

0100 A C 2

0101 B A 0

0110 B C 1

0111 A C 0

1000 A B 3

1001 C B 0

1010 C A 1

1011 B A 0

1100 C B 2

1101 A C 0

1110 A B 1

1111 C B 0

Page 57: HIKGHB Németh Gábor LUF9NV Simon Attila

0001 A C 0

0010 A B 1

0011 C B 0

0100 A C 2

0101 B A 0

0110 B C 1

0111 A C 0

1000 A B 3

1001 C B 0

1010 C A 1

1011 B A 0

1100 C B 2

1101 A C 0

1110 A B 1

1111 C B 0

Page 58: HIKGHB Németh Gábor LUF9NV Simon Attila

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.

Page 59: HIKGHB Németh Gábor LUF9NV Simon Attila

Hanoi tornyai

Megvalósítás ciklussal

- Ha n korong van, 2n-1 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.

Page 60: HIKGHB Németh Gábor LUF9NV Simon Attila

Hogyan lehet megvalósítania rekurziót?

Page 61: HIKGHB Németh Gábor LUF9NV Simon Attila

Hogyan lehet megvalósítani,hogy a függvénynek egyszerre

több példánya éljen?

Page 62: HIKGHB Németh Gábor LUF9NV Simon Attila

Ezt már tudjuk!

Page 63: HIKGHB Németh Gábor LUF9NV Simon Attila

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!

Page 64: HIKGHB Németh Gábor LUF9NV Simon Attila

Mit kell tudnia a függvényről a fordítóprogramnak,

hogy meg tudja hívni?

Page 65: HIKGHB Németh Gábor LUF9NV Simon Attila

azonosítójáta megvalósító szubrutin címét

Page 66: HIKGHB Németh Gábor LUF9NV Simon Attila

paraméterezésétaz átadandó paraméterek típusát

Page 67: HIKGHB Németh Gábor LUF9NV Simon Attila

Ez képezi a függvény deklarációját

Page 68: HIKGHB Németh Gábor LUF9NV Simon Attila

Mit nem szükséges tudniaa függvényről

a fordítóprogramnak, hogy meg tudja hívni?

Page 69: HIKGHB Németh Gábor LUF9NV Simon Attila

megvalósításátaz végrehajtandó utasításokat

Page 70: HIKGHB Németh Gábor LUF9NV Simon Attila

Ez képezi a függvény definícióját

Page 71: HIKGHB Németh Gábor LUF9NV Simon Attila

Hogyan definiálunk függvényt?

Page 72: HIKGHB Németh Gábor LUF9NV Simon Attila

Ezt is tudjuk!

Page 73: HIKGHB Németh Gábor LUF9NV Simon Attila

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>

Page 74: HIKGHB Németh Gábor LUF9NV Simon Attila

A közvetlen rekurzióhoz ez több mint elég!

Page 75: HIKGHB Németh Gábor LUF9NV Simon Attila

Közvetlen rekurzió:

egy szegmens hivatkozik önmagára

Page 76: HIKGHB Németh Gábor LUF9NV Simon Attila

De mi a helyzet a közvetett rekurzióval?

Page 77: HIKGHB Németh Gábor LUF9NV Simon Attila

Közvetett rekurzió:

szegmensek egymásra hivatkozásaiban kör van

Page 78: HIKGHB Németh Gábor LUF9NV Simon Attila

Ez a„tyúk vagy a tojás”

esete!

Page 79: HIKGHB Németh Gábor LUF9NV Simon Attila

Megoldás:

Válasszuk szét a függvénydeklarációját

ésdefinícióját!

Page 80: HIKGHB Németh Gábor LUF9NV Simon Attila

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>

Page 81: HIKGHB Németh Gábor LUF9NV Simon Attila

Függvény deklarációja

<visszatérési érték típusa><függvény azonosítója> (<paraméterek listája>);

Page 82: HIKGHB Németh Gábor LUF9NV Simon Attila

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.

Page 83: HIKGHB Németh Gábor LUF9NV Simon Attila

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.

Page 84: HIKGHB Németh Gábor LUF9NV Simon Attila

A függvény deklarációjaminden a híváshoz szükséges

információt tartalmaz.

A függvény prototípusánakis nevezzük.

Másként a függvény fejléce.

Page 85: HIKGHB Németh Gábor LUF9NV Simon Attila

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