Bouwsteen 4 — herhalen met een while-lus
Hier bouw je op verder
- Python De while-loop
- Python break: uit een lus springen
Leerdoel: je verpakt de vergelijking-stap in een lus die net zo lang draait tot het zoekgebied leeg is — of tot we het doel hebben gevonden.
Waarom een while en geen for?
Bij lineair zoeken gebruikten we for. Daar wist je vooraf hoe vaak je
moest loopen: één keer per element.
Bij binair zoeken weet je het niet. Soms vind je het in stap 1, soms
in stap 7, soms niet. Daarom: while. Een while-lus draait zolang een
voorwaarde waar is.
while voorwaarde:
# blijft draaien zolang 'voorwaarde' True is
Wat is hier de voorwaarde?
De lus moet stoppen als het zoekgebied leeg is. Dat is het geval
zodra laag > hoog. Dus we draaien zolang laag <= hoog:
while laag <= hoog:
...
Waarom <= en niet <?
Bij laag == hoog is er nog één element over (namelijk lijst[laag]).
Dat moeten we nog bekijken — anders missen we mogelijk het doel.
Test met een lijst van één element
Lijst [5], doel 5. Start: laag = 0, hoog = 0.
- Met
<=→ lus draait 1 keer → vindt 5 → returnt 0. Goed. - Met
<→ lus draait 0 keer → geeft niets. Fout.
Voorspel
We voegen nu een print toe bij elke ronde om de stappen zichtbaar te
maken. Wat denk je dat dit print bij doel = 11?
lijst = [1, 3, 5, 7, 9, 11, 13, 15]
laag = 0
hoog = len(lijst) - 1
doel = 11
while laag <= hoog:
midden = (laag + hoog) // 2
print(f"laag={laag}, hoog={hoog}, midden={midden}, lijst[midden]={lijst[midden]}")
if lijst[midden] == doel:
print(f"→ gevonden op {midden}")
break
elif lijst[midden] < doel:
laag = midden + 1
else:
hoog = midden - 1
Antwoord
laag=0, hoog=7, midden=3, lijst[midden]=7
laag=4, hoog=7, midden=5, lijst[midden]=11
→ gevonden op 5
Twee stappen. Bij stap 1 was 7 < 11, dus laag = 4. Bij stap 2 vinden we
het. De break springt dan meteen uit de while; zonder die regel zou de
lus doorgaan tot laag > hoog.
Run
Wat als het doel er niet in zit?
Verander doel in 4 en run opnieuw.
Wat zie je?
Drie stappen, geen "gevonden"-regel — de while-lus stopt vanzelf zodra
laag > hoog. Er gebeurt verder niets.
Dat is een probleem voor de aanroeper: hoe weten zij of het doel gevonden is of niet? In de volgende stap stoppen we het in een functie en voegen we het "niet-gevonden"-geval toe.
Een veiligheid bij experimenteren
Met while kun je een oneindige lus veroorzaken als je voorwaarde nooit
False wordt. Python draait hier in dezelfde browser-tab als de les, dus die
tab bevriest dan helemaal: ook de Reset-knop reageert niet meer. De enige
uitweg is de tab sluiten en de les opnieuw openen, en je code in de speeltuin
ben je dan kwijt.
Twee gewoontes die dat voorkomen:
- Kopieer je code eerst naar een kladblok voordat je met de voorwaarde experimenteert.
- Controleer vóór het runnen dat
laagofhoogin elke ronde echt verandert. Krimpt het zoekgebied niet, dan stopt de lus nooit.
Wat nu nog mist
- De code in een functie stoppen (zodat je hem makkelijk hergebruikt).
- Een duidelijk antwoord bij "niet gevonden" — een
return -1.
Door naar bouwsteen 5: niet gevonden.