Recursie: De torens van Hanoi Lesgever: Tineke Broekaert
Herhaling Recursie? algoritme roept zichzelf op opgeroepen probleem kleiner dan origineel 2 delen: basisgeval en recursief gedeelte oplossing: Eerst basisgeval behandelen! voorbeeld: n! = n(n-1)!
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi Voorwaarden: 1 schijf verplaatsen per beurt geen grote staaf op kleinere plaatsen hulp bron doel 2 1 3
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
BASISGEVAL: 1 schijf verplaatst De torens van Hanoi BASISGEVAL: 1 schijf verplaatst hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
toren van 2 schijven verplaatst De torens van Hanoi toren van 2 schijven verplaatst hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
Toren van drie schijven verplaatst De torens van Hanoi Toren van drie schijven verplaatst hulp bron doel 3 1 2
De torens van Hanoi hulp bron doel 3 1 2
Toren van 4 schijven verplaatst De torens van Hanoi Toren van 4 schijven verplaatst hulp bron doel 3 1 2
De torens van Hanoi Probleem opsplitsen in deelproblemen Algoritme: Als N = 1 enige schijf verplaatst Als N > 1 basisgeval!! recursie!! - Verplaats bovenste n-1 schijven van bron- naar hulpstaaf - Verplaats onderste schijf van begin- naar doelstaaf - Verplaats n-1 schijven van hulp- naar doelstaaf
Implementatie in Logo Deelproblemen? beginsituatie: staven en schijven op het scherm tekenen verplaatsen van schijven: basisgeval schijf afhalen van staaf schijf toevoegen aan staaf Recursieve oproep HANOI verplaatsSchijven beginsituatie
to staaf : staaf : aantalSchijven Implementatie in Logo WAAROM 1. Beginsituatie to staaf : staaf : aantalSchijven setpc [255 0 0] setfc [255 0 0] positie 300*(:staaf-2) 0 repeat 2 [fd 20+:aantalschijven*20 rt 90 fd 30 rt 90] rt 10 fd 5 fill lt 10 test : staaf 1 5 staaf 2 5 staaf 3 5
voegToeSchijf : staaf :schijf Implementatie in Logo WAAROM voegToeSchijf : staaf :schijf setpc [0 0 255] setfc [0 0 255] positie 300*(:staaf-2)-(10*:schijf) (item :staaf :staven)*20 repeat 2 [fd 15 rt 90 fd 30+20*:schijf rt 90] rt 10 fd 5 fill positie 300*(:staaf-2)+5 (item :staaf :staven)*20+5 positie 300*(:staaf-2)+35 (item :staaf :staven)*20+5 lt 10 setItem :staaf :staven (item :staaf :staven)+1
Implementatie in Logo Array: 1 variabele, bevat verschillende items make “arrayNaam {3 4 2} index (item 1 arrayNaam ) setItem 2 arrayNaam 10 3 {3 10 2}
Implementatie in Logo test: make “staven{0 0 0} KORTER? staaf 1 5 voegToeSchijf 2 5 voegToeSchijf 2 4 voegToeSchijf 2 3 voegToeSchijf 2 2 voegToeSchijf 2 1 KORTER? make “aantalSchijven 5 repeat :aantalschijven [voegtoeSchijf 2 :aantalschijven make "aantalschijven :aantalschijven-1]
to beginSituatie :aantalschijven Implementatie in Logo to beginSituatie :aantalschijven cs ht make "staven {0 0 0} staaf 1 :aantalschijven staaf 2 :aantalschijven staaf 3 :aantalschijven repeat :aantalschijven [voegtoeSchijf 2 :aantalschijven make "aantalschijven :aantalschijven-1] beginsituatie HANOI verplaatsSchijven
Implementatie in Logo 2. Verplaatsen van schijven Basisgeval: verplaats 1 schijf to verplaatsSchijf :bronstaaf :doelstaaf :schijf verwijderSchijf : bronstaaf voegToeSchijf :doelstaaf :schijf Procedure verwijderSchijf
Implementatie in Logo to verwijderSchijf :staaf test: verwijderSchijf 2 setItem :staaf :staven (item :staaf :staven)-1 ; schijf wissen setfc [255 255 255] positie 300*(:staaf-2) (item :staaf :staven)*20+5 fill ; paal terugkleuren positie 300*(:staaf-2) (item :staaf :staven)*20 setpc [255 0 0] setfc [255 0 0] repeat 2 [fd 15 rt 90 fd 30 rt 90] rt 10 fd 5 lt 10
Implementatie in Logo procedure verplaatsSchijven To verplaatsSchijven :aantalschijven :bronstaaf :doelstaaf :hulpstaaf ifelse :aantalschijven = 1 [ verplaatsSchijf :bron :doel :aantalschijven ] [ verplaatsSchijven :aantalschijven-1 :bron :hulp :doel verplaatsSchijf :bron :doel :aantalschijven verplaatsSchijven :aantalschijven-1 :hulp :doel :bron]
to hanoi :aantalschijven Implementatie in Logo 3. Oplossing to hanoi :aantalschijven beginSituatie :aantalSchijven verplaatsSchijven :aantalSchijven 2 3 1