Ga naar hoofdinhoud

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

Python
Code-omgeving wordt voorbereid…
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 →.