850 likes | 972 Views
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.
E N D
HÁZI FELADAT HIKGHB Németh Gábor LUF9NV Simon Attila
A programozás alapjai 1 10. előadás Híradástechnikai Tanszék
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 Bináris fa bejárása - inorder(bal gyerek – gyökér – jobb gyerek)rendezés
7 6 3 5 4 2 1 Bináris fa bejárása - posztorder(bal gyerek – jobb gyerek – gyökér)képlet kiértékelése
Bináris fa bejárása typedef … adat; typedef stuct fa { adat a; struct fa *b,*j; } faelem; void feldolgoz (adat d) { … }
Bináris fa bejárása - preordervoid 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); } }
Bináris fa bejárása - inordervoid 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); } }
Bináris fa bejárása - posztordervoid 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őnyeaz elegancia Néhány sorban,könnyen érthetőkódot írhatunk.
A rekurzió nagy hátrányaa 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ó.
Mikor ne használjunk rekurziót? Ha az eredmény zárt alakban is előállítható.Pl.: számtani sorozat n-edik eleme
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 iskönnyen megoldható.
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 iskönnyen megoldható.Pl.: faktoriális számítás
A rekurzió és a ciklus kapcsolata Minden ciklus megvalósítható rekurzióval.
A rekurzió és a ciklus kapcsolata Minden ciklus megvalósítható rekurzióval. Minden rekurzió megvalósítható ciklussal és segédváltozókkal.
A A B B C Vége C Vége A Minden ciklus megvalósítható rekurzióval.
Minden rekurzió megvalósítható ciklussal és segédváltozókkal.
Minden rekurzió megvalósítható ciklussal és segédváltozókkal. A megoldásra rátalálninéha nem könnyű feladat!
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!
Egy könnyű probléma: A Fibonacci számsorozat
Egy könnyű probléma: • A Fibonacci számsorozat • 1 1 2 3 5 8 13 21 34 55 …
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.
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);}
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;}
Egy nehéz probléma: Hanoi tornyai
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=3*′B′-honnan-hova;if (--hanyat) hanoi(hanyat,honnan,seged);printf(″%c %c\n″,honnan,hova);if (hanyat) hanoi(hanyat,seged,hova);}
Hanoi tornyai Megvalósítás ciklussal ?