1 / 19

Grundlæggende programmering Efterår 2001

Grundlæggende programmering Efterår 2001. Forelæsning 10 onsdag 7/11 2001 kl. 9:15 – 12:00. Dagens program. Det praktiske Rekursion. Rekursion. Dette er en anden måde at anskue løkker på. (kapitel 11). public boolean find(char ch, String str) { // returner sand hvis ch er i str

marlon
Télécharger la présentation

Grundlæggende programmering Efterår 2001

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Grundlæggende programmeringEfterår 2001 Forelæsning 10 onsdag 7/11 2001 kl. 9:15 – 12:00

  2. Dagens program • Det praktiske • Rekursion

  3. Rekursion Dette er en anden måde at anskue løkker på. (kapitel 11). public boolean find(char ch, String str) { // returner sand hvis ch er i str if (str.length() == 0) return false; if (str.charAt(0) = ch) return true; return find(ch, str.substring(1, str.length() ) } Hvis str er tom, så fandt vi den ikke. Hvis det er det første bogstav, så fandt vi den. Ellers leder vi i resten af str. Rekursion angiver at en metode bruger sig selv under sin udførsel.

  4. Aktiveringsstak for find public boolean find(char ch, String str) { // returner sand hvis ch er i str if (str.length() == 0) return false; if (str.charAt(0) = ch) return true; return find(ch, str.substring(1, str.length() ) } ch: ’m’ str: ’mand’ ch: ’m’ str: ’emand’ ch: ’m’ str: ’lemand’ ch: ’m’ str: ’ulemand’ ch: ’m’ str: ’Julemand’

  5. Rekursion: Metoder der kalder sig selv • En metode kan kalde en anden metode. • En metode kan også kalde sigselv; dvs. dens metodekrop indeholder et kald til samme metodesignatur i kaldet som i hovedet. • En metode, som indeholder et kald til sig selv, hedder (direkte) rekursiv og det pågældende kald er et rekursivt kald (eller rekursiv invokering). Det at referere til “sig selv” kaldes rekursion (fra Latin: recurrere, at køre igen). • Udførslen af rekursive kald er som for alle kald: For hvert kald (lige meget om rekursiv eller ej) laves en ny metodeaktivering på kaldstakken, og hver gang et kald returnerer fjernes den øverste aktivering igen. • Rekursiv design kræver rekursiv tænkning for at kunne udnytte udtrykskraften i rekursion og i at skrive programmer med rekursive metoder.

  6. Eksempel: Fakultetsfunktion • Fakultetsfunktionen n! beregner produktet n * (n-1) * ... * 2 * 1. Tallet angiver antal forskellige muligheder man har for at halsbånd med n forskellige perler. F.eks 20! = 24329020081766400. • Man kan beregne fakultetsfunktionen iterativt vha. • Man kan også beregne det rekursivt ved at indse, at n! = n * (n-1)! for n > 1, og n! = 1 for n = 1: static int factorial(int n) { int result = 1; while (n>1) result *= n; return result; } static int factorial(int n){ if (n>1) return n * factorial(n-1);else return 1;

  7. Eksempel: Towers of Hanoi • Towers of Hanoi Problem: • Alle skiver skal flyttes fra tårn A til tårn B. • Kun en skive må flyttes ad gangen. • En større skive må aldrig ligge på en mindre skive. A B C

  8. Eksempel: Towers of Hanoi... • Skriv et program, som genererer flytter skiverne. Hvordan gør vi? • Grundide: Flyt de øverste n skiver fra tårn A til tårn B således: • Flyt de øverste n-1 skiver fra tårn A til tårn C. • Flyt den nederste skive fra tårn A til tårn B. • Flyt de n-1 øverste skiver fra tårn C til tårn B. • F.eks., efter trin 1: A B C

  9. Eksempel: Towers of Hanoi... • Fremgangsmåde: • Vi finder ud af, at vi har brug for en operation ”flyt N skiver fra tårn X til tårn Y med tårn Z som hjælpetårn”. • Vi skriver et metodehovede, samt tilhørende kommentar, hvad metoden skal gør: • Så skriver vi metodekroppen først for specielle argumentværdier: • Endelig skriver vi metodekroppen for alle andre værdier: • // flyt(n, x, y, z) flytter de n øverste skiver fra tårn x til tårn y via tårn z • public static void flyt(int antalSkiver, String fra, String til, String via) { if (n==1) // der er kun 1 skive at flytte; flyt den direkte til måltårnet System.out.println(”Flyt en skive fra ” + x + “ til “ + y); else { // udføres når der er mindst 2 skiver at flytte flyt(n-1, x, z, y); flyt(1, x, y, z); flyt(n-1, z, y, x); }}

  10. Eksempel: Towers of Hanoi... • Læg mærke til at: • Vi bruger bare flyt i kroppen og lader som om det allerede er defineret. • Kommentaren på metodehovedet siger, hvad flyt gør når det kaldes. • Det er vigtigt at: • du kan komme på en rekursiv formulering af problemet og problemløsningen (”tænke rekursivt”); • du husker at håndtere specielle værdier uden rekursivt kald, ellers går kroppen i en uendelig løkke.

  11. Kock fraktaler public void trekant(int order, int length){ fraktal(order,length); turn(120); fraktal(order,length); turn(120); fraktal(order,length); }

  12. Kock fraktaler Princippet er at man i stedet for at tegne en enkel linje, tegner en linje med et knæk på.

  13. Kock fraktaler public void fraktal(int order, int length){ if (order == 1) move(length); else { fraktal(order-1,length/3); turn(-60); fraktal(order-1,length/3); turn(120); fraktal(order-1,length/3); turn(-60); fraktal(order-1,length/3); } }

  14. Forklaring order angiver hvor mange knæk der skal være på en linje – på en eller anden måde. public void fraktal(int order, int length){ if (order == 1) move(length); else { fraktal(order-1,length/3); turn(-60); fraktal(order-1,length/3); turn(120); fraktal(order-1,length/3); turn(-60); fraktal(order-1,length/3); } } order = 1 angiver at der ikke skal laves knæk, men blot tegnes en linje. order >1 angiver at der skal laves knæk. Linjen knækkes ved at dele den op i 4 dele. Hver del tegnes en orden mindre.

  15. Aktiverings stak for fraktalen order: 1 length: 9 order: 2 length: 27 order: 3 length: 81

  16. Debuggeren er stoppet ved linjen ”move(length)” i metoden fraktal efter et kald med orden = 5. Man kan se at der er 5 aktiveringer af fraktal metoden i kaldsstakken på dette sted Kaldsstakken i debuggeren

  17. Sortering 22 15 44 33 9 72 37 25 53 47 19 45 11 62 39 27 3 59 13 81 50 sorter hver halvdel for sig 9 15 22 25 33 37 44 47 53 72 3 11 13 19 27 39 45 50 59 62 81 flet de to halvdele 3 9 11 13 15 19 22 25 27 33 37 39 44 45 47 50 53 59 62 72 81

  18. Sorter en halvdel, kvarte, ... 22 15 44 33 9 72 37 25 53 47 22 15 44 33 9 sorter hver kvart for sig sorter hver kvart for sig 15 22 9 33 44 9 15 22 33 44 25 37 47 53 72 flet de to kvarte flet de to kvarte 9 15 22 33 44 9 15 22 25 33 37 44 47 53 72 44 33 9 sorter to tal 44 9 33 flet 9 33 44

  19. Divide-and-conquer • Grundideen bag mergesort (del-og-hersk, divide-and-conquer): For at sortere en tabel med n tal i, gør følgende: • del tabellen i to halvdele; • sorter begge halvdele hver for sig; • flet de to halvdele sammen som et lynlås. • (Se efterfølgende – mere om søgning og sortering næste gang).

More Related