270 likes | 420 Vues
De torens van Hanoi. Stijn Vandamme Stijn.Vandamme@rug.ac.be http://studwww.rug.ac.be/~spvdamme/ailo/. Herhaling. Stijn Vandamme Stijn.Vandamme@rug.ac.be http://studwww.rug.ac.be/~spvdamme/ailo/. Recursie en if (herhaling).
E N D
De torens van Hanoi Stijn Vandamme Stijn.Vandamme@rug.ac.be http://studwww.rug.ac.be/~spvdamme/ailo/
Herhaling Stijn Vandamme Stijn.Vandamme@rug.ac.be http://studwww.rug.ac.be/~spvdamme/ailo/
Recursie en if (herhaling) Teken concentrische cirkeltjes van een (op)gegeven straal en kleiner. to cirkeltjes :straal if (:straal > 0) [ ; Teken de buitenste cirkel circle :straal ; Teken de rest via recursie cirkeltjes (:straal – 10) ] end to cirkeltjes :straal if (:straal < 0) [ stop ] ; Teken de buitenste cirkel circle :straal ; Teken de rest via recursie cirkeltjes (:straal – 10) end
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 Commando’s (herhaling)
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 gebracht • in 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 Breedte van de lijnen: 5 pixels (–315, 0) 203 pixels (–210, 0) 290 pixels 208 pixels (0, 0) 631 pixels
Lijnen 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
Rechthoek (5 + 20 × :dikte) pixels • Eventueel met een rand • Eventueel kleur in functie van :dikte 25 pixels (x, –20 + 28 × :laag)x = –208 als :toren = 1 x = 0 als :toren = 2 x = 208 als :toren = 3
Rechthoek (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
Rechthoek 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
Verwijderen 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
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 :lijn setxy (-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 oproependefunctie make "gem gemiddelde 40 60 fd gemiddelde 10 :gemend
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
Set 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
Get 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
Beginsituatie • to begin :toren :aantal • Zet toren1, toren2en toren3 juist • Tekent de beginsituatie
Beginsituatie 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
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 :vanaantal wait(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 :naar verplaatsen :dikte :van :naar :andere wait(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). ct cs ht pu begin :van :aantal wait(100) recursief :aantal :van :naar :andere end