Title: De torens van Hanoi
1De torens van Hanoi
- Stijn Vandamme
- Stijn.Vandamme_at_rug.ac.be
- http//studwww.rug.ac.be/spvdamme/ailo/
2Herhaling
Stijn Vandamme Stijn.Vandamme_at_rug.ac.be http//stu
dwww.rug.ac.be/spvdamme/ailo/
3Recursie en if (herhaling)
- Teken concentrische cirkeltjes van een
(op)gegeven straal en kleiner.
to cirkeltjes straal if (straal gt 0)
Teken de buitenste cirkel circle straal
Teken de rest via recursie cirkeltjes (straal
10) end
to cirkeltjes straal if (straal lt 0) stop
Teken de buitenste cirkel circle straal
Teken de rest via recursie cirkeltjes (straal
10) end
4Commandos (herhaling)
- setxy x y
- xcor
- ycor
- seth hoek
- fd lengte forward
- bk lengte back
- lt hoek left
- rt hoek right
- setfc kleur setfloodcolor
- setpc kleur setpencolor
- bitblock breedte hoogte
- circle straal
- fill
- for i begin eind
- for i begin eind stap
- if (voorwaarde)
- repeat aantalkeer
- stop
- wait (tijd)
- item nummer lijst
- print tekst
- ct cleartext
- st showturtle
- ht hideturtle
- pu penup
- pd pendown
5Speciale tekens
- De puntkomma Alles na een puntkomma tot einde
lijnis commentaar en wordt niet uitgevoerd Om
uitleg te geven - De tilde Het commando wordt verdergezet op de
volgende lijn Om niet horizontaal te moeten
scrollen
6De Torens van Hanoi
- MytheToren van Brahma (64 blokken)
- Als spel op de markt gebracht
- in 1863 door prof. Claus(College van
Li-Sou-Stian) - pseudoniem vanEdouard Lucas(College van
Saint-Louis)
7Tekenen
- De lijnen (grondvlak en staven)
- Een rechthoek
- toren
- laag
- dikte
- Verwijderen van een rechthoek
- De rechthoek overtekenen in het wit
- De lijn (staaf) hertekenen
- toren
- laag
8Lijnen
Breedte van de lijnen 5 pixels
(315, 0)
203 pixels
(210, 0)
290 pixels
208 pixels
(0, 0)
631 pixels
9Lijnen
- to lijnen
- Tekent de lijnen
- (zowel het grondvlak als de staven)
- voor de beginsituatie.
- setfc lijn
- setxy -315 0
- bitblock 631 5
- for i -210 206 208
- setxy i 0
- bitblock 5 290
-
- end
10Lijnen
- to lijnen
- Tekent de lijnen
- (zowel het grondvlak als de staven)
- voor de beginsituatie.
- setpensize 5 5
- setpc lijn
- setxy -313 2
- seth 90
- pd
- fd 626
- pu
- for i -208 208 208
- setxy i 2
- seth 0
- pd
- fd 285
- pu
-
11setpensize
- setpensize 5 5
- setpensize dikte brol
- In MSWLogo wordt pendikte 1ste argument,2de
argument is nutteloos. - In andere Logo-programmas
- Horizontale pendikte 1ste argument
- Verticale pendikte 2de argument
12Rechthoek
(5 20 dikte) pixels
25 pixels
(x, 20 28 laag)x 208 als toren 1 x
0 als toren 2 x 208 als toren 3
- Eventueel met een rand
- Eventueel kleur in functie van dikte
13Rechthoek
(5 20 dikte) pixels
25 pixels
(x, 20 28 laag)x 210 10 dikte als
toren 1x 2 10 dikte als toren 2x
206 10 dikte als toren 3 x 418
208 toren 10 dikte
14Rechthoek
- to rechthoek toren laag dikte
- Tekent een rechthoek.
- setfc (kleur)
- setxy (-418 208 toren
- - 10 dikte)
- (-20 28 laag)
- bitblock (5 20 dikte) 25
- randen toren laag dikte
- end
- to randen toren laag dikte
- ...
- end
15Verwijderen
maximaal 205 pixels
25 pixels
5 pixels breed
(x, 20 28 laag)x 208 als toren 1 x
0 als toren 2 x 208 als toren 3
16Verwijderen
- to verwijderen toren laag
- Verwijdert een rechthoek
- (en hertekent de lijn).
- setfc 255 255 255
- setxy (-518 208 toren) (-20 28 laag)
- bitblock 205 25
- Lijn hertekenen.
- setfc lijn
- setxy (-418 208 toren) (-20 28 laag)
- bitblock 5 25
- end
17Twee soorten functies
- Procedures (of subroutines)
- Voeren alleen instructies uit
- Kunnen beëindigd worden door stop
- Functies met uitvoer (output)
- Voeren (eventueel) instructies uit
- Geven een antwoord aan oproepende functie door
output (beëindigt functie)
18Functies met uitvoer
- to gemiddelde x y Geeft als output het
gemiddelde van de 2 argumenten - output (x y) / 2
- end
- to oproependefunctie make "gem gemiddelde 40
60 fd gemiddelde 10 gemend
19Functies met uitvoer
- to kleur dikte
- Geeft als output het kleur
- dat hoort bij een blok
- van dikte (dikte).
- make "kleuren 255 0 0 255 0 102
- 255 0 204 204 0 255
- 102 0 255 0 0 255
- 102 0 255 204 0 255
- 255 0 204 255 0 102
- output (item dikte kleuren)
- end
20Set en get
- make "toren1 0make "toren2 0make "toren3 0
- setaantal toren aantalVerandert 1 van de
variabelen - getaantal torenGeeft als output de waarde van 1
van de variabelen
21Set
- to setaantal toren aantal
- Verandert het aantal blokken in toren (toren)
- naar (aantal).
- if (toren 1)
- make "toren1 aantal
-
- if (toren 2)
- make "toren2 aantal
-
- if (toren 3)
- make "toren3 aantal
-
- end
22Set
- to setaantal toren aantal
- Verandert het aantal blokken in toren (toren)
- naar (aantal).
- ifelse (toren 1)
- make "toren1 aantal
-
- ifelse (toren 2)
- make "toren2 aantal
-
- make "toren3 aantal
-
-
- end
23Get
- to getaantal toren
- Geeft als output het aantal blokken
- in toren (toren).
- if (toren 1)
- output toren1
-
- if (toren 2)
- output toren2
-
- if (toren 3)
- output toren3
-
- end
24Get
- to getaantal toren
- Geeft als output het aantal blokken
- in toren (toren).
- ifelse (toren 1)
- output toren1
-
- ifelse (toren 2)
- output toren2
-
- output toren3
-
-
- end
25Beginsituatie
- to begin toren aantal
- Zet toren1, toren2en toren3 juist
- Tekent de beginsituatie
26Beginsituatie
- to begin toren aantal
- Tekent de blokken voor de beginsituatie.
- De beginsituatie is (aantal) blokken
- in toren (toren),
- 0 blokken in de andere 2 torens.
- make "toren1 0
- make "toren2 0
- make "toren3 0
- setaantal toren aantal
- lijnen
- for i 1 aantal 1
- rechthoek toren i (1 aantal - i)
-
- end
27Verplaatsen
- to verplaatsen dikte
- van naar andere
- Zet toren1, toren2 en toren 3 juist
- Verwijdert een blok
- (Wacht eventjes)
- Tekent een blok
28Verplaatsen
- to verplaatsen dikte van naar
- Verplaatst een blok met dikte (dikte)
- van toren (van) naar toren (naar).
- make "vanaantal (getaantal van)
- setaantal van (vanaantal - 1)
- verwijder van vanaantal
- wait(15)
- make "naaraantal (getaantal naar)
- setaantal naar (naaraantal 1)
- rechthoek naar (naaraantal 1) dikte
- end
29Algoritme
- Recursief
- (Voor n blokken)
- Verplaats de kleinste n 1 blokken
- Verplaats de grootste blok
- (Wacht even)
- Verplaats de kleinste n 1 blokken
- Let op bij de kolomargumenten!
- to recursief dikte van naar andere
30Algoritme
- to recursief dikte van naar andere
- Het eigenlijke recursieve algoritme
- voor de animatie van de torens
- van Hanoi.
- if (dikte 0) stop
- recursief (dikte - 1) van andere naar
- verplaatsen dikte van naar andere
- wait(45)
- recursief (dikte - 1) andere naar van
- end
31Hoofdprogramma
- to torenhanoi aantal van naar andere
- Animatie van de toren van Hanoi.
- (aantal) blokken worden verplaatst
- van toren (van) naar (naar).
- ct
- cs
- ht
- pu
- begin van aantal
- wait(100)
- recursief aantal van naar andere
- end
32Aantal zetten
- De toren van Hanoi met 1 blok verplaatsen 1
blok verplaatsen s1 1 zet - De toren van Hanoi met n 1 blokkenverplaatsen
sn 1 sn 1 sn 2 sn 1(Recursieve
uitdrukking!) - 1, 3, 7, 15, 31, 63, 127, 255, sn 2n 1.sn
1 2n 1 1 2 2n 1 2 2n 2 1
1 2 (2n 1) 1 2 sn 1 - Hoeveel is s64?
33Afwerking
- Foutmeldingen
- als n gt 10
- als n lt 0
-
- Functie hanoi aantalmet default van 1,
naar 3 - Functie start met default aantal 5
- Naar boven scrollen scrolly -80