12.9 Zelf bouwen — speel de zetten na
Leerdoel: je gebruikt de zettenlijst om de toestand van de drie palen bij te houden, en controleert dat de toren echt op doel belandt.
De uitdaging
Je hanoi-functie geeft een lijst zetten. Maar klopt het ook? Bewijs het
door de zetten na te spelen en te kijken waar de schijven eindigen.
We stellen elke paal voor als een lijst van schijfgroottes, met de grootste onderaan (index 0) en de bovenste schijf achteraan:
# 3 schijven, alles op paal A:
{"A": [3, 2, 1], "B": [], "C": []}
Schrijf speel(n): begin met alle schijven op A, loop door de zetten van
hanoi(n, "A", "C", "B"), en verplaats telkens de bovenste schijf van
de bron-paal naar de doel-paal. Geef de eindtoestand terug.
Hint — "bovenste schijf van een lijst pakken en op een andere leggen" is precies wat
.pop()en.append(...)doen.
Bouw en test
Antwoord
def speel(n):
palen = {"A": list(range(n, 0, -1)), "B": [], "C": []}
for bron, doel in hanoi(n, "A", "C", "B"):
schijf = palen[bron].pop() # bovenste schijf van bron
palen[doel].append(schijf) # bovenop doel
return palen
Omdat hanoi correct is, ligt op het eind alles op C in de juiste
volgorde — en je legt nooit een grotere op een kleinere.
Extra uitdaging
Kun je ook bepalen bij welke zet de grootste schijf voor het eerst op
doel komt? (Tip: het is precies in het midden van de zettenlijst —
zet 2ⁿ⁻¹.)
Door naar stap 10: fouten →.