Torens van Hanoi ● Uitgevonden door Franse Wiskundige Edouard Lucas in ● Beschreven in zijn wiskundig “spelletjesboek” Récréations Mathématiques ● De Legende: een Hindoe-tempel met priesters (de Brahmanen)
Torens van Hanoi ● Drie staven. Op één staaf zaten 64 gouden schijven van verschillende grootte, de grootste vanonder, de kleinste vanboven. ● Verplaatsen van de ene naar de andere. ● Eén schijf per stap verplaatsen ● Er mag nooit een grotere op een kleinere liggen ● De wereld komt tot een einde als het werk af is.
Torens van Hanoi ● Eén stap per seconde: jaar werk ● Ruwweg veertig maal zoveel de geschatte leeftijd van het heelal!
Torens van Hanoi ● Kleine versie: 8 schijven (verkocht als speelgoed) ● Programmeren: willekeurig aantal staven
Torens van Hanoi ● Hoe aanpakken???
Torens van Hanoi
● Hoe aanpakken??? ● We beginnen met kleinste schijf te verplaatsen
Torens van Hanoi
● Hoe aanpakken??? ● We beginnen met kleinste schijf te verplaatsen ● We nemen volgende schijf en zetten ze op een lege staaf. ● We zetten kleinste schijf erop, we hebben nu een klein torentje van twee schijven verplaatst.
Torens van Hanoi
● Hoe aanpakken??? ● We beginnen met kleinste schijf te verplaatsen ● We nemen volgende schijf en zetten ze op een lege staaf. ● We zetten kleinste schijf erop, we hebben nu een klein torentje van twee schijven verplaatst. ● We zetten de volgende schijf op de lege staaf.
Torens van Hanoi ???
Torens van Hanoi ● Hoe aanpakken??? ● We beginnen met kleinste schijf te verplaatsen ● We nemen volgende schijf en zetten ze op een lege staaf. ● We zetten kleinste schijf erop, we hebben nu een klein torentje van twee schijven verplaatst. ● We zetten de volgende schijf op de lege staaf. ● PROBLEEM: deze schijf moet ONDER het kleine torentje geraken.
Torens van Hanoi
● Hoe aanpakken??? ● We beginnen met kleinste schijf te verplaatsen ● We nemen volgende schijf en zetten ze op een lege staaf. ● We zetten kleinste schijf erop, we hebben nu een klein torentje van twee verplaatst. ● We zetten de volgende schijf op de lege staaf. ● PROBLEEM: deze schijf moet ONDER het kleine torentje geraken. ● OPLOSSING: we verplaatsen het kleine torentje nog eens op dezelfde manier, maar nu gebruiken we de “bronstaaf” als “hulpstaaf”.
Torens van Hanoi
● We hebben terug hetzelfde probleem: ● We hebben een toren van drie schijven gemaakt. ● Er moet een grotere schijf onder.
Torens van Hanoi ● Oplossing: we doen nóg eens alles opnieuw: we verplaatsen de driedelige toren bovenop de grotere schijf.
Torens van Hanoi
● Oplossing: we doen nóg eens alles opnieuw: we verplaatsen de driedelige toren bovenop de grotere schijf. ● We plaatsen eerst het tweedelige torentje op de lege staaf. Hiervoor gebruiken we de “doelstaaf” als hulpstaaf.
Torens van Hanoi
● Oplossing: we doen nóg eens alles opnieuw: we verplaatsen de driedelige toren bovenop de grotere schijf. ● We plaatsen eerst het tweedelige torentje op de lege staaf. Hiervoor gebruiken we de “doelstaaf” als hulpstaaf. ● We plaatsen de onderste schijf van de driedelige toren op de grotere staaf
Torens van Hanoi
● Oplossing: we doen nóg eens alles opnieuw: we verplaatsen de driedelige toren bovenop de grotere schijf. ● We plaatsen eerst het tweedelige torentje op de lege staaf. Hiervoor gebruiken we de “doelstaaf” als hulpstaaf. ● We plaatsen de onderste schijf van de driedelige toren op de grotere staaf. ● We verplaatsen het tweedelige torentje nóg eens, nu op de doelstaaf. De lege staaf kan nu als hulpstaaf gebruikt worden.
Torens van Hanoi
Om een toren van vier te verplaatsen hebben we tweemaal een toren van drie verplaatst. Om een toren van drie te verplaatsen moesten we telkens twee keer een toren van twee verplaatsen. VerplaatsToren 4 VerplaatsToren 3 X2 VerplaatsToren 2 X2
Torens van Hanoi Het probleem is een deelprobleem van zichzelf - -> recursie. VerplaatsToren :n VerplaatsToren :n-1 X2
Torens van Hanoi Als we weten hoe we een toren van hoogte n-1 moeten verplaatsen, hoe verplaatsen we dan een toren van hoogte n (n>1)? Beschrijf het algoritme om dit te doen.
Torens van Hanoi To VerplaatsToren :n VerplaatsToren :n-1 naar hulpstaaf Verplaats onderste schijf naar doelstaaf VerplaatsToren :n-1 van hulpstaaf naar doelstaaf end Het verplaatsen van een toren duurt dus ongeveer dubbel zo lang als het verplaatsen van een toren van één schijf minder! Vandaar dat de priesters zo lang werk hebben aan 64...
Hanoi in LOGO Probleem: we willen een grafische voorstelling maken van de toren van hanoi in LOGO. Schrijf een procedure to hanoi :n die een demonstratie geeft van hanoi voor een toren van n schijven. Verdeel eerst in deelproblemen!!!
Hanoi in LOGO ● We willen de staven en schijven op het scherm tekenen. (De beginsituatie) ● We willen een willekeurig aantal schijven kunnen verplaatsen. ● We willen één schijf kunnen verplaatsen. Hiervoor moeten we ze kunnen tekenen, maar ook uitwissen.
Hanoi in LOGO Hanoi Beginsituatie VerplaatsSchijven VerplaatsSchijf Staaf VoegtoeSchijf VerwijderSchijf
Opmerking Voor het practische gemak maken we gebruik van devolgende procedure die we reeds in een andere les hebben geprogrammeerd: to positie :x :y pu setxy :x :y pd end
Hanoi in LOGO 1) Maak een procedure To Staaf :staaf :aantalschijven :staaf is een waarde 1,2 of 3 (bepaalt de positie), :aantalschijven bepaalt de hoogte van de staaf.
Hanoi in LOGO
Hanoi in LOGO to staaf :staaf :aantalschijven setpc [ ] setfc [ ] positie 300*(:staaf-2) 0 repeat 2 [fd 20+:aantalschijven*20 rt 90 fd 30 rt 90] rt 10 fd 5 fill lt 10 end
Toevoegen van een Schijf ● To voegtoeSchijf :staaf :schijf ● :staaf: De procedure moet weten op welke staaf de schijf moet geplaatst worden! ● :schijf: De procedure moet weten welke schijf (=grootte) er moet geplaatst worden. 1 is de kleinste, 2 is groter, enz... ● De procedure moet nóg iets weten. WAT??? Toch kunnen we deze niet meegeven met een parameter. WAAROM???
Toevoegen van een Schijf ● Oplossing ● We moeten ook weten op welke positie de schijf moet getekend worden. ● We moeten dus weten hoe hoog de toren op de staaf al is, want de volgende schijf moet daar bovenop getekend worden. ● Als we een procedure schrijven om een schijf te verplaatsen, dan moet die werken op ieder moment, voor om het even welk aantal schijven op de staven zitten. ● We moeten de hoogtes van de torens dus bijhouden in variabelen.
Toevoegen van een Schijf ● Er zijn drie staven. We hebben dus drie variabelen nodig! ● Wanneer we een schijf bij een staaf “:staaf” toevoegen, moeten we drie IF-structuren schrijven om de juiste variabele op te vragen! ● Als we de waarde veranderen, moeten we weer drie if-structuren gebruiken! ● Er moet een betere manier zijn... Eén variabele: een “array”.
Toevoegen van een Schijf Make “staaf1 0 Make “staaf2 0 Make “staaf3 0 ;Bijvoorbeeld: er is een schijf toegevoegd if (:staaf=1) make “staaf1 :staaf1+1 if(:staaf=2) make “staaf2 :staaf2+1 if (:staaf=3) make “staaf3 : staaf3+1
Arrays in LOGO ● Een array ● Is één variabele die verschillende items bevat. Iedere item heeft een waarde. ● De items staan in een bepaalde volgorde. Het is dus een rij van waarden. ● De positie van iedere item in die rij noemen we de index.
Arrays in LOGO index items In LOGO heeft de eerste item van de array standaard index 1.
Arrays in LOGO ● Notatie ● Zo maken we een array: – Make “array1 { } ;vier bepaalde elementen – Make “array2 (array 100) ;honderd onbepaalde elementen ● Zo vragen we de waarde van een item op (item 3 array1) ;geeft item met index 3 (=5) ● Zo veranderen we de waarde van een item setItem 50 array2 100 ;zet item 50 op 100
Arrays in LOGO Make “staven {0 0 0} ;Bijvoorbeeld: er is een schijf toegevoegd: setItem :staaf :staven (item :staaf :staven)+1
Toevoegen van een schijf ● Schrijf de procedure voegtoeSchijf. ● Maak eerst manueel een array “Staven” aan, en teken drie staven. ● Zorg dat de procedure in elke toestand werkt ● Schrijf de procedure beginSituatie. Deze doet hetvolgende: ● Tekent 3 staven ● Maakt de array “Staven” ● Voegt :aantalschijven schijven toe
Hanoi in LOGO 10 x volgnummer