Een wachtrij
Je weet nu bij elk vakje waar de robot heen kan. In dit project zoek je de kortste weg van S naar E. Daarvoor heb je eerst een wachtrij nodig: een lijst van dingen die nog aan de beurt moeten komen, waarbij wie het eerst kwam het eerst aan de beurt is. Net als bij de kassa.
Je gebruikt hier buren uit
de buren van een vakje, de while-loop
uit De while-loop, append en pop
uit Lijst-methoden, in op een
dictionary uit
Door een dictionary lopen,
en een tuple als sleutel uit
Nim die van zichzelf leert.
Voorspel
wachtrij = ["Anna", "Bob"]
wachtrij.append("Cem")
eerste = wachtrij.pop(0)
print(eerste)
print(wachtrij)
Wat print dit programma?
Antwoord
Anna
['Bob', 'Cem']
append zet Cem achteraan, en pop(0) haalt de voorste eraf: Anna. Net als
bij de kassa: wie het eerst kwam, is het eerst aan de beurt.
Zo werkt het
Een gewone lijst is een wachtrij als je er op twee manieren mee werkt:
achteraan erbij met append, en vooraan eraf met pop(0). pop(0) haalt het
voorste element uit de lijst en geeft het terug, zodat je het in een variabele
kunt zetten.
Met while len(wachtrij) > 0: ga je door zolang er nog iemand in de rij
staat. Komt er onderweg iemand bij, dan komt die ook nog aan de beurt.
De loop stopt pas als de wachtrij leeg is. Komt er steeds iemand bij, dan stopt hij nooit. De speeltuin heeft geen stopknop, dus het tabblad loopt vast: herlaad de pagina, en je code is weg. Kopieer je code daarom eerst naar een kladblok voordat je een nieuwe while-loop draait.
Onderzoek
- Draai de code. In welke volgorde zijn de klanten aan de beurt?
- Zet in de loop, onder de print,
if klant == "Bob":met daaronderwachtrij.append("Dirk"). Wanneer is Dirk aan de beurt? - Haal die twee regels weg, en verander
pop(0)inpop(). Wat verandert er?
Antwoorden
- Anna, Bob, Cem: in de volgorde waarin ze in de lijst staan.
- Na Cem. Dirk komt achteraan, dus hij wacht op iedereen die er al stond.
- Nu is Cem eerst, dan Bob, dan Anna.
pop()pakt het laatste element. Zo'n lijst, waar je achteraan pakt wat je het laatst erbij zette, heet een stapel.
Opdracht: een kettingbericht
Anna stuurt een bericht naar haar vrienden, en elke vriend stuurt het door naar zijn eigen vrienden. In welke volgorde lezen ze het, als iedereen in een wachtrij op zijn beurt wacht?
Anna leest het bericht
Bob leest het bericht
Cem leest het bericht
Dirk leest het bericht
Eva leest het bericht
Fen leest het bericht
Begin klein, en breid de code stap voor stap uit:
- Draai de code: Anna leest het bericht.
- Zet de vrienden van
persoonachteraan in de wachtrij, met een for-loop overvrienden[persoon]. Zet onderaanprint(wachtrij): daar staan nu Bob en Cem. - Zet alles vanaf
persoon = wachtrij.pop(0)in een loopwhile len(wachtrij) > 0:. Nu leest iedereen het bericht. Haal daarna deprint(wachtrij)weg. - Verander
pop(0)inpop(). In welke volgorde lezen ze het nu?
Tip
Leest iedereen het bericht, maar wil de loop niet stoppen? Kijk of je de
vrienden aan wachtrij toevoegt, en niet aan vrienden.
Antwoord
Dit vervangt alles onder vrienden in de editor:
wachtrij = ["Anna"]
while len(wachtrij) > 0:
persoon = wachtrij.pop(0)
print(persoon, "leest het bericht")
for vriend in vrienden[persoon]:
wachtrij.append(vriend)
Anna leest het bericht
Bob leest het bericht
Cem leest het bericht
Dirk leest het bericht
Eva leest het bericht
Fen leest het bericht
Eerst Anna, dan haar twee vrienden, en pas daarna de vrienden van die
vrienden. Met pop() wordt het Anna, Cem, Fen, Bob, Eva en Dirk: de stapel
gaat eerst bij Cem zo diep mogelijk door, en komt dan pas bij Bob terug.
Door naar breedte-eerst.