Algoritmisk tenkning i problemløsing

Tre krav skiller en algoritme fra en løs beskrivelse: hvert steg må være ENTYDIG (ingen tolkning), rekkefølgen må være bestemt, og den må STOPPE etter endelig mange steg. «Kok opp vann» duger som oppskrift til middag, men ikke som algoritme – «varm vannet til det koker, maks 1010 minutter» gjør det. Framgangsmåten når du skal lage en: løs problemet én gang for hånd, skriv ned nøyaktig hva du gjorde, og bytt så de konkrete tallene med variabler.

abc-formelen

x=b±b24ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

Diskriminanten

D=b24acD = b^2 - 4ac

abc-formelen som algoritme
StegHandling
1Les av a, b og c
2Regn ut b² - 4ac
3Er den negativ: stopp, ingen løsning
4Regn ut de to x-verdiene
5Skriv ut svaret

Tips

  • Test algoritmen på et tilfelle du kan svaret på FØR du bruker den på noe nytt. Finner du feilen der, sparer du deg for å mistolke et ukjent svar.
  • Skriv stegene i punktliste før du skriver kode. Nesten alle programmeringsfeil i 1T er egentlig tenkefeil som ble synlige først i koden.

Eksempel: Fra hånd-regning til algoritme

Beskriv en algoritme som avgjør om et helt tall nn er et primtall, og bruk den på n=91n = 91.

Algoritmen kjørt på n = 91
DivisorGår opp?Handling
2neifortsett
3neifortsett
5neifortsett
7jastopp: ikke primtall
Løsning:
  1. Vi skal avgjøre om n=91n = 91 er et primtall, og løser først for hånd: et primtall er kun delelig med 11 og seg selv, så vi må teste divisorer
  2. det holder å teste opp til n\sqrt{n}, for en større divisor må ha en mindre partner
  3. for n=91n = 91 er 919,5\sqrt{91} \approx 9,5, så vi tester 2,3,5,72, 3, 5, 7
  4. 9191 er ikke delelig med 2,32, 3 eller 55, men 91=71391 = 7 \cdot 13
  5. algoritmen stopper med én gang den finner en divisor. Tallet 9191 er ikke et primtall.
Alternativ forklaring/metode: Løs én bit om gangen

Alternativ metode – innenfor pensum, men ikke hovedmetoden her

Del opp problemet (dekomponering)

Står du fast på et sammensatt problem, del det i mindre biter som hver kan løses for seg: «les inn tallene», «regn ut diskriminanten», «avgjør antall løsninger», «skriv ut svaret». Hver bit blir kort nok til å teste alene, og du finner feil i den ene biten uten å lete gjennom hele algoritmen. Det er nøyaktig samme idé som å regne en lang oppgave i delsvar i stedet for i ett jafs.

Abc-formelen delt i biter
BitTestes for seg
Les inn talleneriktige a, b, c lagret?
Regn ut diskriminantenriktig D for et kjent eksempel?
Avgjør antall løsningerriktig gren for D<0, D=0, D>0?
Skriv ut svaretriktig format og enhet?
Alternativ forklaring/metode: Simuler endring steg for steg

Alternativ metode – innenfor pensum, men ikke hovedmetoden her

Euler-steg for modellering

Skal du modellere noe som endrer seg over tid – en bestand, en temperatur, en saldo – kan du dele opp problemet i identiske, gjentatte steg: finn endringen akkurat NÅ, legg den til, og gjenta. Regelen er yny=ygammel+yΔty_{ny} = y_{gammel} + y' \cdot \Delta t. En bestand på 100100 dyr vokser med 10 %10\ \% av bestanden per tidssteg (y=0,1yy' = 0{,}1y), med Δt=1\Delta t = 1: steg 1 gir y=0,1100=10y' = 0{,}1 \cdot 100 = 10, så yny=100+10=110y_{ny} = 100 + 10 = 110 → steg 2 gir y=0,1110=11y' = 0{,}1 \cdot 110 = 11, så yny=121y_{ny} = 121 → steg 3 gir y=0,1121=12,1y' = 0{,}1 \cdot 121 = 12{,}1, så yny=133,1y_{ny} = 133{,}1. Samme dekomponerings-idé som abc-formelen delt i biter, bare at «biten» her gjentas mange ganger i en løkke.

Euler-steg: bestand på 100, vekst 10 % per steg
Stegy' = 0,1 · yy_ny = y + y'
0100
110110
211121
312,1133,1

Oppgaver

Prøv minst én oppgave på hvert nivå.

Lett(3)

L-11Må en algoritme stoppe etter endelig mange steg?

Vis fasit
BeregningResultat
En algoritme må terminere
ja, den må stoppe
  1. En algoritme må terminere
  2. ja, den må stoppe

L-12Er «regn litt til det ser riktig ut» en algoritme?

Vis fasit
BeregningResultat
«ser riktig ut» kan tolkes ulikt
nei, steget er ikke entydig
  1. «ser riktig ut» kan tolkes ulikt
  2. nei, steget er ikke entydig

L-13Hvor mange divisorer må du teste for å avgjøre om 4949 er primtall?

Vis fasit
BeregningResultat
For 49 er kvadratroten 7
test til og med 7
  1. For 49 er kvadratroten 7
  2. test til og med 7
Middels(3)

M-11Er 9191 et primtall?

Vis fasit
BeregningResultat
91 delt på 7 gir 13
nei, 91 er ikke et primtall
  1. 91 delt på 7 gir 13
  2. nei, 91 er ikke et primtall

M-12Hvorfor holder det å teste divisorer opp til n\sqrt{n}?

Vis fasit
BeregningResultat
Kvadratroten av n er grensen
en divisor over den har en partner under
det holder å teste opp til roten
  1. Kvadratroten av n er grensen
  2. en divisor over den har en partner under
  3. det holder å teste opp til roten

M-13Hva er diskriminanten til x2+2x3=0x^2 + 2x - 3 = 0?

Vis fasit
BeregningResultat
a = 1, b = 2, c-3
D = 4 - 4 gange 1 gange (-3) = 4 + 1216
  1. a = 1, b = 2, c = -3
  2. D = 4 - 4 gange 1 gange (-3) = 4 + 12 = 16
Vanskelig(3)

V-11Hva bør algoritmen gjøre hvis diskriminanten er negativ?

Vis fasit
BeregningResultat
En negativ diskriminant gir ingen reell rot
stopp og meld ingen løsning
  1. En negativ diskriminant gir ingen reell rot
  2. stopp og meld ingen løsning

V-12Hva kalles det å dele et problem i mindre biter?

Vis fasit
BeregningResultat
Å dele 1 problem i flere små deler
hver del løses for seg
dekomponering
  1. Å dele 1 problem i flere små deler
  2. hver del løses for seg
  3. dekomponering

V-13En algoritme tester ALLE tall opp til nn for å sjekke primtall. Er den riktig, og er den god?

Vis fasit
BeregningResultat
Alle tall opp til n gir riktig svar, men testing til roten holder
riktig, men treg
  1. Alle tall opp til n gir riktig svar, men testing til roten holder
  2. riktig, men treg