Download de presentatie
De presentatie wordt gedownload. Even geduld aub
1
Recursie: De Torens van Hanoi
David Joseph Koen Mahieu
2
Recursie? Een recursieve procedure roept zichzelf telkens op om zijn resultaat te bekomen vb. Iemand is een Jood zijn of haar moeder een Jood is zij de vrouw is van Abraham to isJood:persoon IF (persoon = Abrahams’ vrouw) [PRINT ( SE :persoon is joods) STOP] isJood :moeder_van_persoon end Pseudocode !
3
Recursie bepaalde recursieve eigenschap van het probleem maakt probleem plots veel simpeler moeilijkste taak: deze eigenschap ontdekken oplossingsprocedure (argument n) keert terug roept op oplossingsprocedure (argument n - 1) keert terug roept op oplossingsprocedure (argument n - 2) keert terug …. stopconditie
4
De Torens van Hanoi (historiek)
Uitgevonden door een Franse wiskundige, Edouard Lucas en als spel op de markt gebracht in 1883 Speldoos : “ De Toren van Hanoi”
5
De Torens van Hanoi (historiek)
Inspiratie door een mythe over een hindoetempel met een koepel op 3 diamanten zuilen Op 1 zuil : 64 gouden schijven van steeds kleinere diameter Schijven verplaatsen volgens bepaalde regels
6
(2) Geen grotere schijf boven een kleinere
Hanoi Spel verplaats alle schijven van 1ste zuil naar de 2de met behulp van de 3de Regels (1) Slecht 1 schijf per keer verplaatsen (2) Geen grotere schijf boven een kleinere
7
Hanoi Test Probeer zelf het probleem op te lossen met 4 à 5 schijven.
8
Recursieve eigenschap van Hanoi ?
Oplossing : stap voor stap: automatisch:
9
Recursieve eigenschap van Hanoi ?
Welke van deze 4 schijven is de belangrijkste om eerst op de doel staaf te verplaatsen ? (vergeet even de regels) doel hulp bron Hoe kunnen we dit bereiken?
10
Recursieve stap Stap 1 : bovenste schijven naar de hulp staaf verplaatsen doel hulp bron
11
Recursieve stap Stap 2 : grootste schijf naar de “doel” staaf verplaatsen doel hulp bron
12
Recursieve stap Stap 3 : bovenste 3 schijven er terug op plaatsen doel
hulp bron
13
Recursieve stappen Welke problemen blijven nog over?
Stap 1 Het verplaatsen van de bovenste 3 schijven van de bron staaf naar de hulp staaf. Stap 3 Het verplaatsen van deze 3 schijven van de hulp naar de doel staaf.
14
Recursieve stappen Stap 1
Het verplaatsen van de bovenste 3 schijven van de bron staaf naar de hulp staaf. doel hulp bron
15
Recursieve stappen Stap 1
Het verplaatsen van de bovenste 3 schijven van de bron staaf naar de hulp staaf. doel hulp bron
16
Recursieve stappen Stap 3
Het verplaatsen van deze 3 schijven van de hulp naar de doel staaf. doel hulp bron
17
Recursieve stappen Stap 3
Het verplaatsen van deze 3 schijven van de hulp naar de doel staaf. doel hulp bron
18
Verplaats 4 schijven BD
Recursieve stap Probleem van het verplaatsen van een toren van 4 schijven gereduceerd tot het verplaatsen van 3 schijven RECURSIVITEIT Verplaats 4 schijven BD Verplaats bovenste 3 schijven BH Verplaats onderste schijf BD Verplaats bovenste 3 schijven HD Verplaats ond.schijf BH Verplaats ond.schijf HD Verplaats 2 schijven BD Verplaats 2 schijven DH Verplaats 2 schijven HB Verplaats 2 schijven BD Verplaats bovenste schijf HD Verplaats bovenste schijf DB Verplaats bovenste schijf BH Verplaats bovenste schijf HD Verplaats bovenste schijf DB Verplaats bovenste schijf BH Verplaats bovenste schijf BH Verplaats bovenste schijf HD Verplaats onderste schijf HB Verplaats onderste schijf BD Verplaats onderste schijf DH Verplaats onderste schijf BD
19
Hanoi algoritme Schrijf in logo een programma dat de volgende uitvoer geeft:
20
Hanoi algoritme to hanoitext :aantal :bron :doel :hulp
;verplaats een :aantal schijven van :bron naar :doel m.b.v :hulp to hanoitext :aantal :bron :doel :hulp verplaatsen van (aantal - 1) schijven van bron naar hulp m.b.v doel verplaatsen van een onderste schijf van bron naar doel verplaatsen van (aantal - 1) schijven van hulp naar doel m.b.v bron end Om een zin te printen : print (SE “woord :variabele) to hanoitext :aantal :bron :doel :hulp hanoitext (:aantal-1) :bron :hulp :doel print (SE "verplaats "schijf "van :bron "naar :doel) hanoitext (:aantal-1) :hulp :doel :bron end
21
Gevaar bij elk recursief algoritme
Hanoi: algoritme Probleem? to hanoitext :aantal :bron :doel :hulp hanoitext (:aantal-1) :bron :hulp :doel print (SE "verplaats "schijf "van :bron "naar :doel) hanoitext (:aantal-1) :hulp :doel :bron end stopt niet ! Gevaar bij elk recursief algoritme
22
Hanoi: algoritme Stopconditie nodig stopconditie
to hanoitext :aantal :bron :doel :hulp if (:aantal = 0)[STOP] hanoitext (:aantal-1) :bron :hulp :doel print (SE "verplaats "schijf "van :bron "naar :doel) hanoitext (:aantal-1) :hulp :doel :bron end
23
Tekenen Hanoi met LOGO Opgave :
Maak een visuele voorstelling van de Torens van Hanoi. Demonstratie…
24
Deelproblemen Wat moeten we tekenen? Daarna : + Hanoi algoritme
Staven + grondlijn Schijven Verplaatsen van een schijf Daarna : + Hanoi algoritme
25
Afmetingen van de staven
150 (0,0) -300 -200 200 300 x,y 100 200
26
Implementatie van staven
to staven pu setxy pd setxy 300 0 for [i ] [ setxy :i 0 setxy :i 150 pu] end Teken van de grondlijn Teken van een staaf (3x)
27
Tekenen van een schijf Wat hebben we nodig? Welke staaf? Welke laag?
Welke grootte?
28
Afmetingen van de schijf
laag 3 laag 2 laag 1 10 9 laag 0 bitblock :grootte 9 ps: de grootte van de schijf wordt meegegeven
29
Implementatie van schijf
to schijf :staaf :laag :grootte pu if :staaf = 1 [setxy ] if :staaf = 2 [setxy 0 0] if :staaf = 3 [setxy 200 0] sety ((:laag)*10) setx xcor - ((:grootte)/2) bitblock :grootte 9 end positionering aan de voet van de juiste staaf positionering op de juiste hoogte tekenen van de schijf in het midden van de staaf
30
vb procedure schijf vb oproep: “schijf ” 80 40 9 50 (200,0)
31
Tekenen van de beginsituatie
Teken een aantal meegegeven schijven op de eerste staaf. Wat gaan we gebruiken? Opmerking: grootte van de onderste schijf is “aantal” * 10. De volgende schijf is 10 kleiner enz… procedure staven procedure schijf
32
Implementatie van beginfase
to begin :aantal staven for [laag 0 (:aantal-1) 1] [ make "schijfgrootte ( (:aantal*10) - (:laag*10) ) schijf 1 :laag :schijfgrootte] end tekenen van de schijven
33
Verplaatsen van een schijf
3 deelproblemen verwijderen van een schijf teken van een schijf opnieuw tekenen van de staven wat hebben we nodig? van naar grootte laag ‘van’ en laag ‘naar’ Meegeven als attribuut Opslaan als variabele
34
Aantal schijven op de staven
We gaan het aantal schijven op de staven bijhouden dmv variabelen to begin :aantal staven for [laag 0 (:aantal-1) 1] [ make "schijfgrootte (:aantal*10-(:laag)*10) schijf 1 :laag :schijfgrootte] make "toren1laag :aantal make "toren2laag 0 make "toren3laag 0 end
35
Implementatie van verplaats
to verplaats :grootte :van :naar verwijder :grootte :van teken :grootte :naar staven end
36
Verwijderen van een schijf
Wat hebben we nodig? Overtekenen van de zwarte schijf met een witte schijf staaf (gegeven) grootte (gegeven) laag van staaf
37
Implementatie verwijder
to verwijder :grootte :van setfc [ ] if (:van = 1) [make "toren1laag (:toren1laag - 1) schijf :van :toren1laag :grootte] if (:van = 2) [make "toren2laag (:toren2laag - 1) schijf :van :toren2laag :grootte] if (:van = 3) [make "toren3laag (:toren3laag - 1) schijf :van :toren3laag :grootte] end Zet kleur op wit tekent de schijf over in het wit
38
Tekenen van een schijf Idem aan het verwijderen van een schijf
39
tekent de schijf in het zwart
Implementatie teken to teken :grootte :naar setfc [0 0 0] if (:naar = 1) [ schijf :naar :toren1laag :grootte make "toren1laag (:toren1laag + 1)] if (:naar = 2) [ schijf :naar :toren2laag :grootte make "toren2laag (:toren2laag + 1)] if (:naar = 3) [ schijf :naar :toren3laag :grootte make "toren3laag (:toren3laag + 1)] end Zet kleur op zwart tekent de schijf in het zwart
40
Maken van de animatie Wat hebben we nodig? beginsituatie tekenen
verplaatsen van toren (=stapel schijven) van staaf 1 naar staaf 2. Hoe? Algoritme van Hanoi gebruik maken van recursie ! gebruik maken van de procedure verplaats (1 schijf)
41
Implementatie van hanoi
to hanoi :aantal begin :aantal verplaats_toren :aantal 1 2 3 end to verplaats_toren :aantal :van :naar :hulp if(:aantal = 0) [STOP] verplaats_toren (:aantal-1) :van :hulp :naar wait 50 verplaats :aantal*10 :van :naar verplaats_toren (:aantal-1) :hulp :naar :van stopconditie verplaats deeltoren verplaats onderste schijf verplaats deeltoren Waarom juist hier?
42
Verklaring wait-probleem
verplaats_toren 7 … verplaats_toren 6 … … verplaats_toren 1… verplaats_toren 0 … STOP verplaats (schijf) verplaats_toren 0 … STOP … … …
43
Torens van Hanoi: mooiere versie
Demonstratie torenhanoi :aantal :van :naar :andere Thuis eens proberen?
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.