190 likes | 341 Views
Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 10 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder 9.15. www.itu.dk/courses/GP/E2005. Martin Lillholm. Sidste gang. Graphical User Interfaces (GUI) Projekter med relevans for GP – nu på hjemmesiden.
E N D
Grundlæggende Programmering (GP)Efterår 2005Forelæsning 10Slides ligger på nettet. Du er velkommen til at printe dem nu.Vi begynder 9.15.www.itu.dk/courses/GP/E2005 Martin Lillholm
Sidste gang • Graphical User Interfaces (GUI) • Projekter med relevans for GP – nu på hjemmesiden
Denne gang • Det sidste af GUI • Rekursion
Rekursion Nudansk ordbog: I matematik, sprogvidenskab og edb: fremgangsmåde ved definition eller beregning, som består i, at man gentagne gange anvender en og samme simple regel. Andre vil måske sige at rekursion er En definition der benytter begrebet der defineres i definitionen Nogen vil måske foretrækker noget i stil med: Rekursion ... se rekursion (indtil du har forstået ...) Rekursion benyttes når begreber defineres rekursivt
Rekursiv tankegang – et eksempel • En liste af (mindst et) tal kunne defineres ”normalt” som: List: Et eller flere tal adskilt af komma • Eller rekursivt som: List: Et tal eller Et tal komma List Eksempler: 45 343, 12, 34 213, 34, 234 ,234 ,3, 5 • Tavleillustration, uendelig rekursion (uendelig løkke) og basis tilfælde
Rekursiv tankegang (matematisk set) • Funktionen n!, der udtales n fakultet, beregner antallet af rækkefølger (permutationer) af n ting. F.eks. kan 3 personer sættes på en bænk i forskellige måder. • Fakultetsfunktionen n! kan defineres ”normalt” som: • Men kan også defineres rekursivt som: • Tavleillustration, uendelig rekursion og basis tilfælde
Rekursiv programmering • En metode i Java kan kalde sig selv og dermed opnås rekursion • En rekursiv metode er typisk delt op i: • Et basis tilfælde (rekursionen stopper) • De(t) rekursive kald til metoden selv eller • Som altid: • Ethvert (rekursivt) metodekald giver anledning til nyt virkefelt med nye parametre og lokale variable – en ”ny” udgave af metoden • Når et metodekald afsluttes returneres til den kaldende metode – altså i tilfældet rekursion ofte til ”metoden selv” • Direkte og indirekte rekursion
Fakultetsfunktionen i Java int rfak(int n) { // Rekursiv fakultetsfunktion if (n == 0) return 1; // Basis tilfælde else return n * rfak(n - 1); // Rekursivt kald } int ifak(int n) { // Iterativ fakultetsfunktion int resultat = 1; for (int i=n; i >= 1; i=i-1) resultat = resultat * i; return resultat; } Side 580 i L&L for sum
Og så den lidt syrede forklaring • Den om manden og hans klon-maskine … http://personal.vsnl.com/erwin/recintro.htm
Rekursion vs. iteration • Alle problemer kan løses både iterativt og rekursivt. Rekursion er en anden måde at tænke på – men ækvivalent. • Rekursive løsninger er ofte elegante på papiret • Men ... • Er langsommere pga. de mange metodekald • Kræver mere lager • Kan nemt ”løbe løbsk” • Til gengæld ... • Findes der problemer, der er egner sig rigtig godt til rekursion • Og faktisk er temmelig besværlige at løses iterativt uden hjælpedatastrukturer
Tårnene i Hanoi – elegant rekursion • Berømt ”spil” fra 1880’erne (Edouard Lucas) • Alle skiver skal flyttes fra tårn A til tårn C. • Kun en skive må flyttes af gangen • En større skive må aldrig ligge oven på en mindre skive A B C
Tårnene i Hanoi – eksempel Startopstilling Træk 1 Træk 2 Træk 3
Tårnene i Hanoi – eksempel Træk 4 Træk 5 Træk 6 Træk 7 (slut)
Tårnene i Hanoi – rekursiv algoritme Flyt en stak af n skiver fra tårn A til tårn B med tårn C til hjælp: • Flyt de øverste n-1 skiver til ektrapinden • Flyt den nederste skive til destinationspinden • Flyt de n-1 skiver fra ekstrapinden til destinationspinden Men hvordan løser vi 1 for de n-1 skiver – rekursion. Hvordan ville vi løse dette iterativt ?
Tårnene i Hanoi • SolveTowers.java side 590 i L&L i BlueJ • Dog med et par twists – se en af dagens opgaver • Grundideen i rekursion er altså at løse et problem ved gentagne gange at løse simplere delproblemer af samme slags • Virker kun hvis delproblemerne rent faktisk er simplere end det oprindelige problem og • Hvis de ender med et trivielt delproblem (basis tilfælde) • Eksponentiel kompleksitet 2N-1 for N skiver … og historiens om verdens undergang … en skive hver sekund for 64 skiver tager 548 milliarder år
Fibonacci tal • Talrækken: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... • Tavlegennemgang • Sjove eksempler fra den virkelige verden på: • http://www.mcs.surrey.ac.uk/Personal/R.Knott/Fibonacci/fibnat.html
Quicksort – sortering med rekursion • Peter Sestofts note
Fraktaler • Fraktaler er geometriske former, der er selvsimilære eksempelvis ved at det samme mønster gentages på forskellige skalaer og orienteringer • Koch Snowflake – uformel gennemgang • KochSnowflake.java side 597 i L&L i BlueJ