Fangeproblemet – matematisk løsning ved hjelp av programmering

Hentet fra Matematikk.org

Elevene mine fikk dette velkjente matematiske problemet de skulle løse og mange av dem ble ganske frustrerte da de skjønte at å tegne opp ville ta ganske lang tid. Ganske mange av dem endte opp med å løse problemet i Excel, mens også de syntes at de måtte fylle ut ganske mange rader før de kom i mål.

Men hvorfor ikke løse det ved hjelp av programmering? Om vi lager en liste som simulerer alle dørene, og sier at 0 er ulåst og 1 er låst, kan dette løses raskt og enkelt.

Denne oppgaven er relativt komplisert og passer nok best på ungdomstrinnet. Dette løsningsforslaget er i Scratch, men kan også løses i Python. En versjon av koden finner du på https://scratch.mit.edu/projects/1111784329

Kompetansemål i matematikk etter 8.trinn
– utforske hvordan algoritmer kan skapes, testes og forbedres ved hjelp av programmering
Kompetansemål i matematikk etter 10.trinn
– modellere situasjoner knyttet til reelle datasett, presentere resultatene og argumentere for at modellene er gyldige
– utforske matematiske egenskaper og sammenhenger ved å bruke programmering

Hvordan begynne med oppgaven?
Oppgaven kan løses på flere måter, men i dette tilfellet er det kanskje enklest å lage en liste, hvor en sier at en forekomst i listen samsvarer med en dør. Den er enten låst(1) eller åpen(0). Dette kan forstås med programmeringsmetoden som kalles Sant/Usant (True/False). En bryter (i dette tilfellet en dør) er enten i den ene eller andre tilstanden. Deretter låser vi opp eller låser dører alt etter hvilken status døren har når vi kommer til den.

Opprettelse av liste og låse alle dører
Vi oppretter en liste (under Variabler) og kaller denne «Status». Vi kunne kalt den «Dør», men vi prøver å unngå øæå i variabler og lister. Viktig at denne listen vises, slik at vi ser den hele tiden. Når programmet starter, sletter vi alt i listen.

Deretter må vi opprette 50 forekomster(dører) i listen, og det gjør vi ved hjelp av en løkke. I dette forslaget har jeg valgt å sette døren til 1 dersom den er låst, og 0 når den er åpen. Nå skal alle dørene låses.

Sjekke om døren er låst eller ikke
Nå skal vi kontrollere om døren er låst eller ikke. Dette skal gjøres for hver enkelt fangevokter, men vi skal ta den delen litt senere. Nå skal vi bare lage en generell test på hver forekomst i listen. Til dette trenger vi to variabler. Den ene er en «vokter» som holder kontroll på hvilken vokter som sjekker dørene, og den andre er en «teller» som holder styr på hvilken dør vi er kommet til.

Vi lager testen først: Om døren er låst, skal den låses opp. Om den er åpen skal den låses. Vi bruker en «hvis» – test som ligger under styring, og legger inn vilkåret i det åpne feltet.

Vi må hente ut hver enkelt forekomst i listen, og sjekke om den er låst (1).

Hvis den er det, må vi åpne den(endre den til 0). Om den er åpen (0), må vi låse den.

Dette skal vi gjøre for hver enkelt dør, altså fra dør 1 til 50. Dette løses enklest ved hjelp av en løkke. Vi setter derfor telleren til 1 før vi begynner løkken, endrer telleren med 1 for å komme til neste dør, og gjentar dette til vi er kommet til dør 50.

Kjøre denne løkken gjennom hver fangevokter
Vi skal nå kjøre denne løkken for hver enkelt fangevokter, altså trenger vi enda en løkke. I tillegg var det slik at fangevokterne hadde forskjellig måte å telle på. Den første sjekket alle dørene, den andre annenhver dør, den tredje hver tredje dør osv.

Dette må vi ta høyde for, og endre telleren fra forrige steg med fangevokterens nummer fra denne løkken.

Vi begynner med å sette variabelen «vokter» til 1 før vi begynner løkken.

Denne løkken skal kjøres til vi når vokter 50.

Og inne i denne løkken, skal vi kjøre testene vi laget i forrige steg. Men vi gjør en liten endring i koden. Istedenfor å endre telleren med 1, skal vi endre den med samme verdi som vokteren har.

Nå er vi nesten i mål, men vi må huske å endre vokterens verdi for hver runde. Den skal endres med 1, og legges inn nederst i den ytterste løkken.

På tide å teste litt
Om du har gjort alt rett nå, skal du ha en lang kode som kjøres ved å klikke på det grønne flagget. Noen forekomster i listen skal ha verdien 0 (åpen), mens andre skal ha verdien 1(låst).

Telle hvor mange dører som er åpne
Vi kan selvsagt telle i listen på skjermen hvor mange dører som er åpne, men vi skal lage en liten kode som se gjennom listen og teller opp hvor mange forekomster som har verdien 0. Vi trenger en variabel som holder styr på antall åpne dører. La oss kalle den «open», for å unngå æøå, og sette den til 0.

Deretter lager vi en løkke som begynner med første forekomst i listen og stopper når den passerer 50.

Inne i denne løkken legger vi testen, som sjekker om forekomsten er 0, og om den er det endrer den variabelen «open» med 1.

Til slutt legger vi inn en kode som lar figuren fortelle hvor mange dører som er åpne.

Oppsummering og utvidelse
– Du får nå ut et antall dører som er åpne. Men om du går inn i listen og finner ut hvilke dører som er åpne, finner du et system? Hva kaller vi disse tallene?
– Om fengselet har 100 celler og 100 fangevoktere? Prøv å forutsi svaret ditt på antall åpne dører. Endre koden og se om du har rett.

Kommentarer er stengt.

Blogg på WordPress.com.

opp ↑