de torens van hanoi
DESCRIPTION
De torens van Hanoi. Stijn Vandamme [email protected] http://studwww.rug.ac.be/~spvdamme/ailo/. Herhaling. Stijn Vandamme [email protected] http://studwww.rug.ac.be/~spvdamme/ailo/. Recursie en if (herhaling). - PowerPoint PPT PresentationTRANSCRIPT
Recursie en if (herhaling)
Teken concentrische cirkeltjes van een (op)gegeven straal en kleiner.
to cirkeltjes :straalif (:straal > 0) [
; Teken de buitenste cirkelcircle :straal; Teken de rest via recursiecirkeltjes (:straal – 10)
]end
to cirkeltjes :straalif (:straal < 0) [ stop ]; Teken de buitenste cirkelcircle :straal; Teken de rest via recursiecirkeltjes (:straal – 10)
end
Commando’s (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
Speciale 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
De Torens van Hanoi
• Mythe:Toren van Brahma (64 blokken)
• Als spel op de markt gebrachtin 1863 door prof. Claus(College van Li-Sou-Stian)pseudoniem vanEdouard Lucas(College van Saint-Louis)
Tekenen
• 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
Lijnen
631 pixels
Breedte van de lijnen: 5 pixels
290
pixe
ls
208 pixels
(–315, 0)
(–210, 0)203 pixels
(0, 0)
Lijnen
to lijnen; Tekent de lijnen; (zowel het grondvlak als de staven); voor de beginsituatie.
setfc :lijnsetxy -315 0bitblock 631 5for [i -210 206 208] [
setxy :i 0bitblock 5 290
]end
Rechthoek
• Eventueel met een rand• Eventueel kleur in functie van :dikte
(5 + 20 × :dikte) pixels25
pix
els
(x, –20 + 28 × :laag)x = –208 als :toren = 1x = 0 als :toren = 2x = 208 als :toren = 3
Rechthoek(5 + 20 × :dikte) pixels
25 p
ixel
s
(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
Rechthoek
to rechthoek :toren :laag :dikte; Tekent een rechthoek.
setfc (:kleur)setxy (-418 + 208 * :toren ~ - 10 * :dikte) ~ (-20 + 28 * :laag)bitblock (5 + 20 * :dikte) 25randen :toren :laag :dikte
end
to randen :toren :laag :dikte...
end
Verwijderenmaximaal 205 pixels
25 p
ixel
s
(x, –20 + 28 × :laag)x = –208 als :toren = 1x = 0 als :toren = 2x = 208 als :toren = 3
5 pixels breed
Verwijderen
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 :lijnsetxy (-418 + 208 * :toren) (-20 + 28 * :laag)bitblock 5 25
end
Twee 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)
Functies met uitvoer
to gemiddelde :x :y; Geeft als output; het gemiddelde van de 2 argumenten
output (:x + :y) / 2
end
to oproependefunctiemake "gem gemiddelde 40 60fd gemiddelde 10 :gem
end
Functies 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
Set 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
Setto 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
Getto 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
Beginsituatie
to begin :toren :aantal• Zet toren1, toren2
en toren3 juist• Tekent de beginsituatie
Beginsituatieto 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 0make "toren2 0make "toren3 0setaantal :toren :aantallijnenfor [i 1 :aantal 1] [
rechthoek :toren :i (1 + :aantal - :i)]
end
Verplaatsen
to verplaatsen :dikte ~:van :naar :andere• Zet toren1, toren2 en toren 3 juist• Verwijdert een blok• (Wacht eventjes)• Tekent een blok
Verplaatsen
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 :vanaantalwait(15)make "naaraantal (getaantal :naar)setaantal :naar (:naaraantal + 1)rechthoek :naar (:naaraantal + 1) :dikte
end
Algoritme
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
Algoritme
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 :naarverplaatsen :dikte :van :naar :anderewait(45)recursief (:dikte - 1) :andere :naar :van
end
Hoofdprogramma
to torenhanoi :aantal :van :naar :andere; Animatie van de toren van Hanoi.; (:aantal) blokken worden verplaatst; van toren (:van) naar (:naar).
ctcshtpubegin :van :aantalwait(100)recursief :aantal :van :naar :andere
end