Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

HIKGHB Németh Gábor LUF9NV Simon Attila. A programozás alapjai 1 10. előadás Híradástechnikai Tanszék.

Hasonló előadás


Az előadások a következő témára: "HIKGHB Németh Gábor LUF9NV Simon Attila. A programozás alapjai 1 10. előadás Híradástechnikai Tanszék."— Előadás másolata:

1 HIKGHB Németh Gábor LUF9NV Simon Attila

2 A programozás alapjai előadás Híradástechnikai Tanszék

3 Rekurzió

4 Bináris fa bejárása - preorder (gyökér – bal gyerek – jobb gyerek) mentés - visszaállítás

5 Bináris fa bejárása - inorder (bal gyerek – gyökér – jobb gyerek) rendezés

6 Bináris fa bejárása - posztorder (bal gyerek – jobb gyerek – gyökér) képlet kiértékelése

7 Bináris fa bejárása typedef … adat; typedef stuct fa { adat a; struct fa *b,*j; } faelem; void feldolgoz (adat d) { … }

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

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

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

11 Közvetlen rekurzió: egy szegmens hivatkozik önmagára

12 Közvetett rekurzió: szegmensek egymásra hivatkozásaiban kör van

13 A rekurzió célja:

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

15 A rekurzió kritikus pontja:

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

17 A rekurzió nagy előnye

18 A rekurzió nagy előnye az elegancia

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

20 A rekurzió nagy hátránya

21 A rekurzió nagy hátránya a csábítás

22 Akkor is használjuk, ha kevéssé hatékony, sőt pazarló.

23 Mikor ne használjunk rekurziót?

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

25 Mikor ne használjunk rekurziót? Ha az eredmény zárt alakban is előállítható. Pl.: számtani sorozat n-edik eleme

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

27 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

28 A rekurzió és a ciklus kapcsolata

29 A rekurzió és a ciklus kapcsolata Minden ciklus megvalósítható rekurzióval.

30 A rekurzió és a ciklus kapcsolata Minden ciklus megvalósítható rekurzióval. Minden rekurzió megvalósítható ciklussal és segédváltozókkal.

31 Minden ciklus megvalósítható rekurzióval. A C B Vége A B C A

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

33 A megoldásra rátalálni néha nem könnyű feladat!

34 Minden rekurzió megvalósítható ciklussal és segédváltozókkal. A megoldásra rátalálni néha nem könnyű feladat! Lássunk példát erre is, arra is!

35 Egy könnyű probléma:

36 A Fibonacci számsorozat

37 Egy könnyű probléma: A Fibonacci számsorozat …

38 Egy könnyű probléma: A Fibonacci számsorozat … A sorozat harmadik elemétől kezdve minden elem az előző kettő összege.

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

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

41 Egy nehéz probléma:

42 Hanoi tornyai

43 Egy nehéz probléma: Hanoi tornyai A MESE

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

45 4 A B3 A C2 A B1 A C 1 A B 1 C B 1 A C 2 B C1 B A 1 B C 1 A C 1 A B 3 C B2 C A1 C B 1 C A 1 B A 1 C B 2 A B1 A C 1 A B 1 C B

46 Hanoi tornyai Megvalósítás ciklussal ?

47 4 A B3 A C2 A B1 A C 1 A B 1 C B 1 A C 2 B C1 B A 1 B C 1 A C 1 A B 3 C B2 C A1 C B 1 C A 1 B A 1 C B 2 A B1 A C 1 A B 1 C B

48 4 A B3 A C2 A B1 A C 1 A B 1 C B 1 A C 2 B C1 B A 1 B C 1 A C 1 A B 3 C B2 C A1 C B 1 C A 1 B A 1 C B 2 A B1 A C 1 A B 1 C B

49 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

50 1A C 2A B 3C B 4A C 5B A 6B C 7A C 8A B 9C B 10C A 11B A 12C B 13A C 14A B 15C B

51 0001A C 0010A B 0011C B 0100A C 0101B A 0110B C 0111A C 1000A B 1001C B 1010C A 1011B A 1100C B 1101A C 1110A B 1111C B

52 0001A C0 0010A B1 0011C B0 0100A C2 0101B A0 0110B C1 0111A C0 1000A B3 1001C B0 1010C A1 1011B A0 1100C B2 1101A C0 1110A B1 1111C B0

53 0001A C0 0010A B1 0011C B0 0100A C2 0101B A0 0110B C1 0111A C0 1000A B3 1001C B0 1010C A1 1011B A0 1100C B2 1101A C0 1110A B1 1111C B0

54 0001A C0 0010A B1 0011C B0 0100A C2 0101B A0 0110B C1 0111A C0 1000A B3 1001C B0 1010C A1 1011B A0 1100C B2 1101A C0 1110A B1 1111C B0

55 0001A C0 0010A B1 0011C B0 0100A C2 0101B A0 0110B C1 0111A C0 1000A B3 1001C B0 1010C A1 1011B A0 1100C B2 1101A C0 1110A B1 1111C B0

56 0001A C0 0010A B1 0011C B0 0100A C2 0101B A0 0110B C1 0111A C0 1000A B3 1001C B0 1010C A1 1011B A0 1100C B2 1101A C0 1110A B1 1111C B0

57 0001A C0 0010A B1 0011C B0 0100A C2 0101B A0 0110B C1 0111A C0 1000A B3 1001C B0 1010C A1 1011B A0 1100C B2 1101A C0 1110A B1 1111C B0

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

59 Hanoi tornyai Megvalósítás ciklussal - Ha n korong van, 2 n -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.

60 Hogyan lehet megvalósítani a rekurziót?

61 Hogyan lehet megvalósítani, hogy a függvénynek egyszerre több példánya éljen?

62 Ezt már tudjuk!

63 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!

64 Mit kell tudnia a függvényről a fordítóprogramnak, hogy meg tudja hívni?

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

66 paraméterezését az átadandó paraméterek típusát

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

68 Mit nem szükséges tudnia a függvényről a fordítóprogramnak, hogy meg tudja hívni?

69 megvalósítását az végrehajtandó utasításokat

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

71 Hogyan definiálunk függvényt?

72 Ezt is tudjuk!

73 Függvény definíciója ( )

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

75 Közvetlen rekurzió: egy szegmens hivatkozik önmagára

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

77 Közvetett rekurzió: szegmensek egymásra hivatkozásaiban kör van

78 Ez a „ tyúk vagy a tojás” esete!

79 Megoldás: Válasszuk szét a függvény deklarációját és definícióját!

80 Függvény definíciója ( )

81 Függvény deklarációja ( ) ;

82 Függvény deklarációja ( ) ; A blokk helyén ; áll.

83 Függvény deklarációja ( ) ; A paraméterek nevét a fordítóprogram nem veszi figyelembe, ezért elhagyható, vagy tetszőleges nevet használhatunk.

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

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


Letölteni ppt "HIKGHB Németh Gábor LUF9NV Simon Attila. A programozás alapjai 1 10. előadás Híradástechnikai Tanszék."

Hasonló előadás


Google Hirdetések