Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaAlbert Pintér Megváltozta több, mint 10 éve
1
HIKGHB Németh Gábor LUF9NV Simon Attila
2
A programozás alapjai 1 10. 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 1 52 7643
5
Bináris fa bejárása - inorder (bal gyerek – gyökér – jobb gyerek) rendezés 4 62 7531
6
Bináris fa bejárása - posztorder (bal gyerek – jobb gyerek – gyökér) képlet kiértékelése 7 63 5421
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 1 1 2 3 5 8 13 21 34 55 …
38
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 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á.
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.