While-løkker i Python
Med ei while-løkke gjentar vi operasjonen helt til vi når et bestemt mål. Noen ganger kan vi sette opp dette målet selv, og andre ganger bruker man while-løkker når man ikke vet hvor lenge en løkke skal kjøre. Man kan tenke på ei while-løkke om en rekke gjentatte if-tester.
Ei while-løkke består av ordet while etterfulgt av et logisk utsagn, altså noe som enten er True eller False. På neste linje står det som skal gjøres helt til det logiske utsagnet blir usant. Dette kan vises slik:
while [et logisk utsagn er sant]:
[gjør operasjon]
Tidligere har vi simulert gjentatte terningkast med for-løkker, hvis vi f.eks. har ønsket å kaste fem terninger. Et eksempel på når ei while-løkke hadde passet bedre, er dersom vi vil kaste en terning helt til vi får en sekser. Da vet vi ikke hvor mange ganger noe må gjentas, men vi vet når vi er ferdig.
Største felles faktor til to tall
Faktorene til et tall er hvilke heltall vi kan multiplisere for å få dette tallet. Faktorene til tallet 15 er 1, 3, 5, 15, siden 1 ⋅ 15 = 15 og 3 ⋅ 5 = 15. Til større tall kan det etter hvert bli mange faktorer.
Nå skal vi lage et program som finner største felles faktor til to tall som brukeren oppgir. Vi starter med å se på en grafisk løsning, deretter skal vi programmere det.
Algoritme (beskrivelse)
Vi skal nå gjennomføre følgende steg:
Finn nærmeste akse til punktet og trekk ei linje normalt ned fra punktet til aksen.
Trekk ei like lang linje fra punktet normalt mot den andre aksen, marker dette punktet.
Fullfør trekanten (skal bli likebeint).
Velg punktet fra steg 2 som ditt nye startpunkt og gå til steg 1.
Når det nye punktet ligger på aksen y = x har du funnet største felles faktor. I eksempelet til høyre ser vi at største felles faktor til 18 og 24 er 6.
Nå skal vi prøve å gjøre dette i Python.
Algoritme (grafisk)
Det er to spørsmål vi må svare på før vi kan begynne å programmere:
Når er vi ferdig? Det vil si, hvilket krav er oppfylt når vi avslutter stegene i algoritmen?
Hva gjør vi for å komme fra punkt til punkt?
While-løkke som kjører et bestemt antall ganger
Selv om det er vanlig å bruke for-løkker når vi vet hvor mange ganger noe skal gjentas, kan vi også bruke while-løkker. Vi må bare passe på at betingelsen i while-løkka (det som står etter while) oppdateres passe mange ganger.
Her er et eksempel der vi skriver ut fire tall (0, 1, 2, 3) med ei while-løkke:
Rekkefølgen på operasjonene i while-løkka er avgjørende for hva du får som output. Koden under er den samme som over, bortsett fra at linje 4 og 5 har byttet plass. Tenk gjennom hvordan du tror outputen vil være annerledes før du kjører den:
Oppgave: Kvadrattall med while-løkke
Bytt ut spørsmålstegnene ??? i koden under for å lage et program som bruker ei while-løkke til å skrive ut de fire første kvadrattallene, altså:
1
4
9
16
Tilfeldige tall i while-løkker
Oppgave: Tallgjetting
Nå skal vi lage et program som trekker et tilfeldig tall, og ved hjelp av input()-funksjonen lar oss gjette hva tallet er. Programmet skal la brukeren gjette om og om igjen helt til man finner det riktige tallet. Du kan bruke flytskjemaet under kodeboksen for å bygge opp programmet.
Lenke til koden: https://trinket.io/python3/13bc60cee2
Flytskjema som kan være til hjelp
UTFORDRING:
Utvid programmet slik at det også gir beskjed om du har gjettet for høyt eller lavt..
Få programmet til å telle hvor mange gjett man trenger, og gi beskjed om antallet til slutt.
Du finner et flytskjema som kan være til hjelp hvis du trykker på denne boksen.
Tall som vokser
Vi kan også bruke while-løkker til å utforske tall som vokser til en grense.
Under er et eksempel på Python som prøver å regne ut summen av 1/2 + 1/4 + 1/8 + 1/16 + ...
altså summen av elementene i rekka 1/2n der n går fra 1 til uendelig. Som gif-en til venstre under skal illustrere vil dette nærme seg, men aldri bli, 1.
Python vil derimot runde av etter hvert som det blir mange desimaler, og vi ser at vi "får 1" etter 55 runder:
Oppgave: Vekstfaktor
Du skal lage et program som regner ut prosentvis økning i flere perioder. Programmet skal ta inn et beløp, renteprosent og ønsket sluttbeløp som input-verdier, og bruke ei while-løkke til å regner ut hvor mange år det vil gå før vi når dette beløpet.
Du kan bruke flytskjemaet under kodeboksen for å bygge opp programmet.
Lenke til koden: https://trinket.io/python3/1c09d9731d
Flytskjema som kan være til hjelp
Oppgave: Fibonaccitall
Fibonaccitallene er den berømte tallrekka
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
der de to første tallene er 0 og 1, og hvert påfølgende tall er summen av de to foregående. Tallrekka dukker overraskende ofte opp i både matematikk og biologi.
Lag et program som skriver ut de 20 første fibonaccitallene.
Endre programmet til å i stedet skrive ut alle fibonaccitallene som er mindre enn 50'000.
Du finner "skjelettkode" (halvferdig kode der utvalgte deler er fjernet) under kodeboksen.