Ga naar hoofdinhoud

12.10 Er gaat iets mis — top-3 fouten

Leerdoel: je herkent de drie klassieke valkuilen bij de recursieve Hanoi-oplossing.

Basisgeval vergeten

Foutmelding: RecursionError: maximum recursion depth exceeded.

Oorzaak: zonder if n == 0 blijft de functie zichzelf aanroepen met n - 1, ook onder nul. Er is geen afslag, dus de recursie stopt nooit.

# FOUT — geen basisgeval
def hanoi(n, bron, doel, hulp):
zetten = []
zetten += hanoi(n - 1, bron, hulp, doel) # telt eindeloos af
zetten.append((bron, doel))
zetten += hanoi(n - 1, hulp, doel, bron)
return zetten

Oplossing: begin met de stopconditie.

# GOED
def hanoi(n, bron, doel, hulp):
if n == 0:
return []
...

hulp en doel verwisseld in de recursieve call

Geen foutmelding — wél een verkeerde zettenlijst (schijven belanden op de verkeerde paal).

Oorzaak: in stap 1 moeten de n - 1 bovenste schijven naar de hulp-paal, niet naar het uiteindelijke doel. De derde paal (doel) dient daar even als tijdelijke hulp.

# FOUT — n-1 schijven gaan meteen naar doel
zetten += hanoi(n - 1, bron, doel, hulp)
zetten.append((bron, doel))
zetten += hanoi(n - 1, hulp, doel, bron)

Oplossing: in stap 1 staat hulp op de doel-plek, en doel is de tijdelijke hulp.

# GOED
zetten += hanoi(n - 1, bron, hulp, doel) # naar de HULP-paal
zetten.append((bron, doel))
zetten += hanoi(n - 1, hulp, doel, bron)

Vuistregel: de schijven die je tijdelijk opzij zet, gaan altijd naar de paal die je in déze stap níet als bron of doel gebruikt.

Recursie met n in plaats van n - 1

Foutmelding: opnieuw een RecursionError.

Oorzaak: roep je de functie aan met dezelfde n, dan wordt het probleem nooit kleiner en bereik je het basisgeval nooit.

# FOUT
zetten += hanoi(n, bron, hulp, doel) # zelfde n → oneindig

Oplossing: elke recursieve stap doet één schijf minder.

# GOED
zetten += hanoi(n - 1, bron, hulp, doel)

Vuistregel bij recursie: élke aanroep moet dichter bij het basisgeval komen — hier dus met een kleinere n.

Door naar stap 11: cheatsheet →.