Vurdere og feilsøke en algoritme

En algoritme kan være GAL (gir feil svar), eller RIKTIG MEN DÅRLIG (gir riktig svar unødvendig tregt). Begge deler skal vurderes. Feilsøking gjøres systematisk, ikke ved å stirre: lag en sportabell der du følger hver variabel gjennom hver runde, og finn den FØRSTE raden der en verdi ikke er som forventet. Feilen ligger da i steget rett før. Test alltid grensetilfellene – tomt datasett, n=0n = 0, negative tall – for det er der algoritmer nesten alltid ryker.

Sum av 1 til n

S=n(n+1)2S = \frac{n(n + 1)}{2}

Kontroll

forventetfaktisk=0\text{forventet} - \text{faktisk} = 0

Tre klassiske feiltyper
FeilSymptomFiks
Feil startverdisvaret er konstant for høyt/lavtsjekk verdien før løkken
Løkken går én for kortsiste element manglersjekk grensene
Løkken stopper aldriprogrammet hengersjekk at betingelsen endres

Tips

  • Sammenlign svaret med en formel du kan uavhengig, som n(n+1)2\frac{n(n+1)}{2} for summen. Er avviket akkurat det siste leddet, går løkken én for kort.
  • En while-løkke der betingelsen aldri endres, stopper aldri. Sjekk at variabelen i betingelsen faktisk oppdateres inne i løkken.

Eksempel: Finne feilen med en sportabell

En algoritme skal summere 11 til 55, men gir 1010 i stedet for 1515. Finn feilen.

Sportabell for den feilende løkken
isKjørt?
11ja
23ja
36ja
410ja
515nei – her stopper den
Løsning:
  1. Vi vet at riktig svar er 562=15\frac{5 \cdot 6}{2} = 15, men algoritmen gir 1010
  2. avviket er 1510=515 - 10 = 5, altså nøyaktig det siste leddet
  3. det peker på at løkken stopper for tidlig, ikke at addisjonen er feil
  4. sporer vi verdiene, går løkken i=1i = 1 til i=4i = 4 og summerer til 1010
  5. i=5i = 5 kjøres aldri. Feilen er at løkken går én runde for kort.
Alternativ forklaring/metode: Skriv ut midt i algoritmen

Alternativ metode – innenfor pensum, men ikke hovedmetoden her

Halveringssøk i koden

Er algoritmen lang, ikke spor den fra start til slutt. Skriv i stedet ut verdiene midtveis: er de riktige der, ligger feilen i andre halvdel, ellers i første. Gjenta i den halvdelen som er feil. Ti steg krever da tre–fire sjekker i stedet for ti. Det er samme idé som når du leter i en ordbok ved å slå opp på midten, ikke ved å bla fra første side.

Halveringssøk på den samme feilende løkken
SjekkpunktForventet sFaktisk sKonklusjon
Midtveis (i = 3)66Stemmer – feilen er ikke i første halvdel
Ved slutten (i = 5)1510Avvik – feilen er i siste del av løkken
Alternativ forklaring/metode: La et symbolsk verktøy regne ut fasiten

Alternativ metode – innenfor pensum, men ikke hovedmetoden her

SymPy (symbolsk matematikk i Python)

I stedet for å huske eller utlede kontrollformelen selv, kan et symbolsk verktøy som SymPy regne den ut nøyaktig: sympy.summation(i, (i, 1, 5)) gir det EKSAKTE svaret 1515, uten avrunding og uten at du selv må huske formelen n(n+1)2\frac{n(n+1)}{2}. Sammenlign så dette fasitsvaret med hva det numeriske programmet (løkken) faktisk gir – akkurat som i hovedeksempelet avslører avviket på 55 at løkken stopper for tidlig. Forskjellen fra vanlig kode er at SymPy regner SYMBOLSK: det finner den eksakte formelen bak tallene, ikke bare ett tallsvar.

Symbolsk fasit mot numerisk løkke
MetodeKodeResultat
Symbolsk (SymPy)sympy.summation(i, (i, 1, 5))15
Numerisk (løkken)s = 0; for i in range(1,5): s += i10 (feil)

Oppgaver

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

Lett(3)

L-31Hva er summen av 11 til 55?

Vis fasit
BeregningResultat
Summen fra 1 til 5 er 5 gange 6 delt på 215

Summen fra 1 til 5 er 5 gange 6 delt på 2 = 15

L-32En løkke stopper aldri. Hva kalles det?

Vis fasit
BeregningResultat
En løkke som aldri stopper kalles en evig løkke

En løkke som aldri stopper kalles en evig løkke

L-33Hva kaller vi en tabell som følger variablene gjennom hver runde?

Vis fasit
BeregningResultat
En tabell som følger 1 verdi per runde
verdiene spores gjennom løkken
en sportabell
  1. En tabell som følger 1 verdi per runde
  2. verdiene spores gjennom løkken
  3. en sportabell
Middels(3)

M-31En algoritme gir 1010 når den skulle gitt 1515. Hva er avviket?

Vis fasit
BeregningResultat
15 minus 105
det er nøyaktig siste ledd
løkken går én for kort
  1. 15 minus 10 = 5
  2. det er nøyaktig siste ledd
  3. løkken går én for kort

M-32Summen av 11 til 100100 skal bli 50505 050. Algoritmen gir 49504 950. Hva mangler?

Vis fasit
BeregningResultat
5 050 minus 4 950100
siste ledd, altså 100, mangler
  1. 5 050 minus 4 950 = 100
  2. siste ledd, altså 100, mangler

M-33En sum-algoritme starter med s = 1 i stedet for s = 0. Hva skjer?

Vis fasit
BeregningResultat
Start på 1 i stedet for 0
svaret blir 1 for høyt hver gang
  1. Start på 1 i stedet for 0
  2. svaret blir 1 for høyt hver gang
Vanskelig(3)

V-31Er en algoritme som gir riktig svar, men tester alle tall opp til nn, god nok?

Vis fasit
BeregningResultat
Riktig svar, men flere steg enn nødvendig
riktig, men treg
  1. Riktig svar, men flere steg enn nødvendig
  2. riktig, men treg

V-32Hvilke tilfeller bør du alltid teste?

Vis fasit
BeregningResultat
Feil oppstår oftest i ytterkantene
test 0, tomt datasett og negative tall
  1. Feil oppstår oftest i ytterkantene
  2. test 0, tomt datasett og negative tall

V-33En while-løkke sjekker i < 10, men i endres aldri. Hva skjer?

Vis fasit
BeregningResultat
i under 10 er alltid sant når i aldri endres
løkken går evig
  1. i under 10 er alltid sant når i aldri endres
  2. løkken går evig