recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie



Vergelijkbare documenten
Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

10 Meer over functies

Stacks and queues. Hoofdstuk 6

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Recursie: definitie. De som van de kwadraten van de getallen tussen m en n kan als volgt gedefinieerd worden:

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

1 Recurrente betrekkingen

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Modelleren en Programmeren

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

Informatica: C# WPO 11

Arrays in LOGO. In LOGO heeft de eerste item van de array standaard index 1.

Modelleren en Programmeren

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Tentamen Programmeren in C (EE1400)

Inleiding Programmeren 2

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Tweede college algoritmiek. 12 februari Grafen en bomen

Een eenvoudig algoritme om permutaties te genereren

Inleiding Programmeren 2


Vierde college algoritmiek. 23/24 februari Complexiteit en Brute Force

Tentamen Programmeren in C (EE1400)

Derde college algoritmiek. 23 februari Complexiteit Toestand-actie-ruimte

Datastructuren: stapels, rijen en binaire bomen

8.1 Herleiden [1] Herleiden bij vermenigvuldigen: -5 3a 6b 8c = -720abc 1) Vermenigvuldigen cijfers (let op teken) 2) Letters op alfabetische volgorde

Zevende college algoritmiek. 24 maart Verdeel en Heers

Zevende college Algoritmiek. 6 april Verdeel en Heers

Inhoud. Eindtoets. Introductie 2. Opgaven 3. Bijlage bij opgaven 9. Terugkoppeling 12

Algoritmiek. 15 februari Grafen en bomen

Inhoud. Introductie tot de cursus

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

8.1 Herleiden [1] Herleiden bij vermenigvuldigen: -5 3a 6b 8c = -720abc 1) Vermenigvuldigen cijfers (let op teken) 2) Letters op alfabetische volgorde

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

TEST INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCHAPPEN - ACADEMIEJAAR

Getallensystemen, verzamelingen en relaties

Derde college algoritmiek. 22 februari Complexiteit Toestand-actie-ruimte

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Combinatoriek groep 1 & 2: Recursie

Recursie. public static int faculteit( int n ){ // Deze functie berekent n! // pre: n = N en n >= 0 // post: faculteit = N!

Inhoud introductie. Introductie tot de cursus

OEFENINGEN PYTHON REEKS 6

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Machten, exponenten en logaritmen

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ.

8C080 deel BioModeling en bioinformatica

Programmeren in C++ Efficiënte zoekfunctie in een boek

1 Inleiding in Functioneel Programmeren

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/

Opgave 1. (4 punten) Inleiding: Vraag: Hints: (maximaal 2 bonuspunten) Tentamen Algoritmiek voor Biologen

4. Exponentiële vergelijkingen

Derde college complexiteit. 7 februari Zoeken

Derde college algoritmiek. 18 februari Toestand-actie-ruimte

Analyse. Samenvatting: logaritmen. Frank Derks Gerard Heijmeriks

x (n+1) = a.x (n). e -x(n)

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Vierde college algoritmiek. 1 maart Toestand-actie-ruimte Brute Force

1. Orthogonale Hyperbolen

Derde college algoritmiek. 16/17 februari Toestand-actie-ruimte

Stoomcursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO ( ) = = ( ) ( ) ( ) = ( ) ( ) = ( ) = = ( )

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Modelleren en Programmeren

Examencursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO kan niet korter

Modelleren en Programmeren

Datastructuren en Algoritmen

IMP Uitwerking week 13

Hoofdstuk 9. Hashing

Over binaire beslissingsdiagrammen naar Donald E. Knuth s The Art of Computer Programming, Volume 4

Lineaire data structuren. Doorlopen van een lijst

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c

Tentamen Programmeren in C (EE1400)

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Tweede Toets Datastructuren 28 juni 2017, , Educ-β.

sheets Programmeren 2 Java Recursie, de muis en graphics Walter Kosters

REEKS I. Zaterdag 6 november 2010, 9u

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Datastructuren en Algoritmen voor CKI

Datastructuren: stapels, rijen en binaire bomen

Vierde college complexiteit. 14 februari Beslissingsbomen

Informatica: C# WPO 10

Tijd is geen goede maatstaf, want is afhankelijk van computer waarop algoritme wordt gedraaid.

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Modelleren en Programmeren

9. Strategieën en oplossingsmethoden

exponentiële en logaritmische functies

Derde college algoritmiek. 23 februari Toestand-actie-ruimte

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

Datastructuren Uitwerking jan

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Combinatoriek groep 1

Transcriptie:

Hoofdstuk 5 Recursion I N T R O D U C T I E Veel methoden die we op een datastructuur aan kunnen roepen, zullen op een recursieve wijze geïmplementeerd worden. Recursie is een techniek waarbij een vraagstuk over een datastructuur gereduceerd wordt tot een vraagstuk over een kleinere datastructuur en dit proces te herhalen tot een vraagstuk over een basisgeval dat eenvoudig opgelost kan worden. In deze leereenheid zullen we uitgebreid ingaan op recursie. Het hele tekstboekhoofdstuk 5 behoort tot de leerstof met uitzondering van paragraaf 5.1.4. LEERDOELEN Na het bestuderen van deze leereenheid wordt verwacht dat u de bestanddelen van een recursieve methode kunt noemen zelf een recursieve definitie kunt lezen en opstellen zelf een recursieve methode kunt ontwerpen voor- en nadelen van recursie kunt noemen lineaire en binaire recursie kunt herkennen een paar voorbeelden van recursie kunt geven. Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie Engels recursion recursion trace Nederlands recursie recursie spoor, recursie trace L E E R K E R N Studienet Inductief gedefiniëerde functies zijn behandeld in de cursussen discrete wiskunde. Op de cursussite vindt u een verwijzing naar de paragrafen waar u zo nodig deze voorkennis op kunt halen. 5.1 Foundations of recursion OPGAVE 5.1 Geef een recursieve definitie van de functie machtsverheffen x n voor n en x. 39

Open Universiteit Datastructuren en algoritmen OPGAVE 5.2 Geef een iteratieve en een recursieve implementatie in Java van de functie x n voor x en n. 5.3 Applications of recursion 5.3.1 LINEAR RECURSION OPGAVE 5.3 Maak opgave R-5.4 van het tekstboek. OPGAVE 5.4 Geef een recursief algoritme voor het vinden van het maximum in een array A van n elementen. OPGAVE 5.5 Geef een recursief algoritme die het aantal schakels telt in een enkel geschakelde lijst. OPGAVE 5.6 De methode keerom retourneert voor een gegeven string s een string waarvan de letters in omgekeerde volgorde staan. Bijvoorbeeld keerom( bal ) heeft als terugkeerwaarde lab. Geef een recursieve implementatie van de methode keerom. Aanwijzing: beschouw een niet-lege string als bestaand uit één karakter gevolgd door een string en gebruik om die string te krijgen de methode substring(int) uit de klasse java.lang.string. Hoe wordt recursie door de Java virtual machine mogelijk gemaakt? Bij iedere methodeaanroep worden alle belangrijke gegevens van de aanroepende methode, zoals de plaats van de aanroep (program counter) en de waarde van de parameters en van de lokale variabelen, op een speciale plaats bewaard. Deze plaats heet de Java-stack. Bij terugkeer van de aangeroepen methode krijgen alle gegevens hun oorspronkelijke waarde weer terug. Daarom kan een methode ook zichzelf aanroepen zonder dat alle waarden verloren gaan. Na de aanroep kan de methode gewoon doorgaan op het punt waar zij gebleven was. De Java-stack wordt in hoofdstuk 6 verder uitgelegd en in paragraaf 15.1 wordt nader ingegaan op het gebruik van de Java-stack bij de implementatie van recursie. 5.3.2 BINARY RECURSION Het tekstboek gebruikt de notatie log 2 x in plaats van het in Nederland meer gebruikelijke 2 log x, om de logaritme van x met grondtal 2 aan te duiden. OPGAVE 5.7 Maak nogmaals opgave 5.4, nu met behulp van binaire recursie. 40

Hoofdstuk 5 Recursion We beëindigen dit hoofdstuk met een mooie toepassing van recursie, De torens van Hanoi. De torens van Hanoi is een wiskundige puzzel en geldt als standaardvoorbeeld voor recursie omdat het zich op elegante wijze recursief laat oplossen. OPGAVE 5.8 a Op studienet vindt u de url van de webpagina van Interactive Mathematics Miscellany and Puzzles Lees de uitleg van het spel op deze pagina. b Probeer de puzzel zelf op te lossen, eerst met vier schijven en daarna met een groter aantal schijven. Gebruik, als u er zelf niet uitkomt, de knop Suggest move om een enkele stap uit te laten voeren of bekijk de animatie van de oplossing door op de knop Slow te klikken (zie figuur 5.1). FIGUUR 5.1 De torens van Hanoi c Lees daarna op die webpagina de delen Recursive solution en Recurrence relations. d Hoe zou de functie Solve er uitzien als, in plaats van N = 0, men N = 1 zou kiezen als speciaal geval? e Denkt u dat het ook mogelijk is om De torens van Hanoi op een niet-recursieve manier op te lossen en zou het dan sneller werken? 41

Open Universiteit Datastructuren en algoritmen T E R U G K O P P E L I N G Uitwerking van de opgaven 5.1 Recursieve definitie van x n voor n : i x 0 = 1 ii x n = x x (n 1) voor n > 0 NB: de toevoeging n > 0 in het ii-deel is van belang voor de juistheid van de definitie. 5.2 In deze opgave en in opgave 5.6 worden als oplossingen statische methoden gegeven. Oplossingen met niet-statische methoden zijn ook mogelijk. Iteratieve implementatie /** * Berekent een macht. * @param x het grondtal * @param n de exponent * @return x^n * Voorwaarde: n >= 0 */ public static double machtit(double x, int n) { double res = 1; for (int i = 1; i <= n; i++) { res = res * x; return res; Recursieve implementatie /** * Berekent een macht * @param x het grondtal * @param n de exponent * @return x^n * Voorwaarde: n >= 0 */ public static double machtrec(double x, int n) { if (n == 0) { return 1; else { return x * machtrec(x, n 1); 42

Hoofdstuk 5 Recursion 5.3 Een trace van deze aanroep is FIGUUR 5.2 De trace van de methodeaanroep 5.4 Als een array maar één element bevat, is het maximum van de array-elementen gelijk aan dit element. Dit geval vormt de basis van de recursie. Het maximum van een array A met n elementen is gelijk aan het maximum van A[n 1] en het maximum van het arraydeel dat bestaat uit de eerste n 1 elementen van de array. Om recursie te kunnen gebruiken geven we het algoritme daarom een extra parameter mee: maxarray(a, k) bepaalt het maximum van de eerste k elementen van A. Algorithm maxarray(a, k) Input: een array A gevuld met gehele getallen en een natuurlijk getal k > 0. Output: het maximum van de eerste k getallen uit A als k = 1 return A[k 1] anders return max(a[k 1], maxarray(a, k 1]) 5.5 Algorithm lengte(v) Input: Een schakel van de lijst. Output: De lengte van de lijst vanaf de schakel v als v = null return 0 anders return lengte(v.getnext()) + 1 Aanroep van deze methode op header geeft de lengte van de totale lijst. 43

Open Universiteit Datastructuren en algoritmen 5.6 In deze oplossing kan de string s ook de lege string zijn. /** * Geeft de omkering van een gegeven string. * @param s de string * @return de omkering van s. */ public static String keerom(string s) { if (s.length()== 0) { return ""; else { return keerom(s.substring(1)) + s.charat(0); 5.7 Nu splitsen we, net als in codefragment 5.10, de array bij elke recursiestap in twee delen: Algorithm maxarray(a, i, n) Input: een array A gevuld met gehele getallen en natuurlijk getallen i en n Output: het maximum van de n getallen uit A vanaf index i als n = 1 return A[i] anders return max(maxarray (A, i, n/2 ), maxarray(a, i + n/2, n/2 )) Aanroep van de methode maxarray(a, 0, A.length) berekent het maximum van alle elementen uit A. 5.8 a Het spel De torens van Hanoi bestaat uit een stapel van N schijven en drie pinnen, de bron (Src), de hulp (Aux) en de bestemming (Dst). De stapel schijven moet verplaatst worden van de bron naar de bestemming. Daarbij kan men gebruik maken van de hulp. Men mag maar één schijf tegelijk verplaatsen en er mag nooit een grotere schijf op een kleinere schijf geplaatst worden. b Geen uitwerking. c Het verplaatsen van N schijven kan als volgt worden opgelost. Verplaats de bovenste N 1 schijven van Src naar Aux met Dst als hulppin Verplaats de grootste schijf van Src naar Dst Verplaats de N 1 schijven van Aux naar Dst met Src als hulppin De functie T N is het minimale aantal verplaatsingen dat nodig is om het spel op te lossen. Voor T N geldt de volgende recurrente betrekking (recursieve functie): T 0 = 0 T N = 2 T N 1 + 1 voor N > 0 Voor deze formule geldt: T N = 2 N 1 voor N 0 44

Hoofdstuk 5 Recursion d Als voor het speciale geval N = 1 wordt genomen, dan moet een puzzel bestaand uit één schijf worden opgelost. Die schijf moet van Src naar Dst worden verplaatst. Solve(N, Src, Aux, Dst) if N is 1 Move from Src to Dst exit else Solve(N-1, Src, dst, Aux) Move from Src to Dst Solve(N-1, Aux, src, Dst) e Alles wat recursief opgelost kan worden, is ook iteratief op te lossen. In het geval van De torens van Hanoi zullen iteratieve oplossingen complexer worden. Een recursieve methode maakt impliciet gebruik van de Java-stack om tot de oplossing te komen. Een iteratieve methode voor De torens van Hanoi zou bijvoorbeeld zelf alle tussenresultaten kunnen opslaan, net zoals het in de Java-stack gebeurt. Dit zou zeker niet sneller zijn dan een recursieve methode. 45