Summere tallrekker med Scratch

På denne siden skal vi se hvordan vi kan bruke Scratch (scratch.mit.edu/projects/editor/ Links to an external site.) til å eksperimentere med å summere tallrekker.

Vi forutsetter kjennskap til løkker, aritmetiske operatorer, variabler og innlesing i Scratch.

Beregne antall håndtrykk

I et klassisk problem skal alle personer i ei gruppe håndhilse på hverandre, og vi skal finne ut hvor mange håndtrykk det blir totalt.

I ei gruppe med bare 2 personer blir det naturligvis bare ett håndtrykk. Men introduserer vi en tredje person, blir det en ny person å hilse på for begge to, så det blir 2 håndtrykk til, totalt 1 + 2. Introduserer vi en fjerde person, blir det en ny person å hilse på for alle tre, så det blir 3 håndtrykk til, totalt 1 + 2 + 3. Generelt, introduserer vi person nummer n, blir det n − 1 nye håndtrykk. I en gruppe på n personer blir det derfor totalt 1 + 2 + 3 + … + n − 1 håndtrykk.

Med mange personer i ei gruppe, blir det mange addisjoner. Vi skal derfor bygge en kloss i Scratch som gjør addisjonene for oss. Men i stedet for å bygge alt på en gang, skal vi bruke en teknikk som heter skrittvis forfining, der vi starter med noe enkelt, og så bygger på, mens vi hele tiden tester at klossen virker som den skal.

Vår første utgave av klossen er vist i eksempel 1. I den skriver vi inn en verdi for n, altså antall personer, og lar katten si tallene 1, 2, 3, … , n − 1 .

Eksempel 1:

Klossen under lar katten si tallene 1, 2, 3, … , n − 1, der verdien til n skrives i det blanke feltet.

Kloss som lar katten si tallene fra 1 til n-1

Klossen inneholder to variabler: n, som representerer antall personer i ei gruppe, og telle-tall, som vi bruker til å telle oppover fra 1.

Det første som skjer når vi klikker på klossen, er at variabelen n får den verdien vi har skrevet inn i det blanke feltet. Deretter blir telle-tall satt til 1. Så går vi inn i ei løkke som gjennomløpes n − 1 ganger, det vil si én gang for hvert av tallene fra 1 til n − 1. I løkka sier først katten verdien til telle-tall, som ved første gjennomløp er 1. Deretter økes verdien til telle-tall med 1, altså fra 1 til 2 ved første gjennomløp. Ved neste gjennomløp sier først katten 2, deretter økes verdien til telle-tall fra 2 til 3. Når løkka er gjennomløpt n − 1 ganger, har katten sagt alle tallene fra 1 til n − 1.

Skriver vi for eksempel inn 5 i det blanke feltet i klossen i eksempel 1, og klikker på den, sier katten 1, 2, 3, 4, som er riktig. Vi kan gjerne teste med noen flere verdier.

Nå er det lite fleksibelt å måtte skrive inn verdien til n hver gang vi skal bruke klossen, så vi bygger på slik at brukeren kan gi inn gi inn en verdi underveis. Det gjør vi ved å bruke klossen "si … og vent", som er beskrevet på siden Lese inn fra bruker i Scratch. Klossen ser nå ut som i eksempel 2.

Eksempel 2:

Klossen under lar katten si tallene 1, 2, 3, … , n − 1, der verdien til n oppgis av brukeren.

Kloss som lar katten si tallene fra 1 til n-1, der katten spør etter verdien til n

Når vi klikker på klossen, sier katten Antall personer?, og venter på at brukeren skal skrive inn et tall. Det brukeren skriver inn, kopieres så fra variabelen svar inn i variabelen n. Deretter fungerer alt som i eksempel 1.

Til slutt endrer vi klossen slik at katten, i stedet for å si tallene fra 1 til n − 1, summerer dem, og sier summen til slutt. Vi trenger da en variabel til å holde rede på summen, vi har kalt den håndtrykk, siden det er håndtrykk vi summerer. Vi initialiserer håndtrykk til 0, og adderer telle-tall for hvert gjennomløp i løkka. En slik variabel som samler opp verdier, kaller vi en akkumulatorvariabel. Den ferdige klossen kan se ut som i eksempel 3.

Eksempel 3:

Klossen under lar katten si antall håndtrykk i en gruppe med det antallet personer brukeren gir inn.

Kloss der katten spør etter n, og sier antall håndtrykk i en gruppe på n personer

Klikker vi på klossen i eksempel 3, og svarer 5 når katten spør etter antall personer, svarer katten Antall håndtrykk er 10. Det er riktig, for i en gruppe på 5 personer blir det 1 + 2 + 3 + 4 = 10 håndtrykk.

Beregne med formel

En annen måte å beregne antall håndtrykk på er å tenke seg at i en gruppe på n personer hilser hver av de n personene på n − 1 andre, totalt n(n − 1) hilsninger. Men når person A hilser på person B, hilser jo B på A med samme håndtrykk, så antall håndtrykk blir bare halvparten av dette, altså LaTeX: {\large \frac{n(n-1)}{2}}n(n1)2 håndtrykk.

I en gruppe på 2 personer blir det LaTeX: {\large \frac{2(2-1)}{2}} = {\large \frac{2(1)}{2}} = {\large \frac{2}{2}} = 12(21)2=2(1)2=22=1 håndtrykk, i en gruppe på 3 personer blir det LaTeX: {\large \frac{3(3-1)}{2}} = {\large \frac{3(2)}{2}} = {\large \frac{6}{2}} = 33(31)2=3(2)2=62=3 håndtrykk, i en gruppe på 4 personer blir det LaTeX: {\large \frac{4(4-1)}{2}} = {\large \frac{4(3)}{2}} = {\large \frac{12}{2}} = 64(41)2=4(3)2=122=6 håndtrykk, som stemmer med det vi regnet ut tidligere.

Bygger vi om klossen fra eksempel 3 slik at den bruker denne formelen, kan den bli som i eksempel 4.

Eksempel 4:

Klossen under gjør det samme som klossen i eksempel 3, men bruker en formel til å beregne antall håndtrykk.

Kloss der katten spør etter n, og sier antall håndtrykk i en gruppe på n personer

Vi ser at klossen i eksempel 4 er mye enklere enn den i eksempel 3, selv om den gir samme resultat. Den har ingen løkke, vi trenger ikke variabelen telle-tall, og vi beregner verdien til håndtrykk bare én enkelt gang. At den ikke har noen løkke, gjør den også mer effektiv, fordi antall beregninger ikke øker med økende n. I det hele tatt er klossen i eksempel 4 en mye bedre algoritmisk løsning på problemet med å beregne antall håndtrykk. En forbedring vi har fått gjennom å bruke symbolsk algebra.

Summere tall opp til n

Nå generaliserer vi litt, og lager en kloss for å summere heltallene 1 + 2 + 3 + … + n, der brukeren gir inn verdien til n. Vi tar utgangspunkt i klossen i eksempel 3, og endrer antall gjennomløp av løkka fra n − 1 til n. Vi navner også om variabelen håndtrykk til sum, og endrer strengene "Antall personer?" til "Hva er n?", og "Antall håndtrykk er " til "Summen er ". Den nye klossen er vist i eksempel 5.

Eksempel 5:

Klossen under lar katten si summen av tallene fra 1 til n, der brukeren gir inn verdien til n.

Kloss der katten spør etter n, og sier summen av tallene fra 1 til n

Klikker vi på klossen i eksempel 5, og svarer 5 når katten spør etter n, svarer katten Summen er 15. Det er riktig, for når n er 5, blir summen 1 + 2 + 3 + 4 + 5 = 15.

Øvingsoppgave 1:

Ta utgangspunkt i klossen i eksempel 5, og endre den slik at summeringen starter på et vilkårlig tall, m, i stedet for på 1. Det vil si at summen skal være m + (m+1) + (m+2) + … + n. Verdien til m skal gis inn av brukeren.

Hvis for eksempel brukeren gir inn verdiene 5 for m og 10 for n, skal katten beregne og si summen 5 + 6 + 7 + 8 + 9 + 10 = 45.

Hint: I tillegg til å lese inn m, må du endre verdien telle-tall starter på, og antall gjennomløp i løkka. Hvis m lik 5 og n lik 10 ikke gir sum 45, kan det være at antall gjennomløp er feil.

Summere med formel

En bedre løsning når det gjelder å beregne summen fra 1 til n, er imidlertid å bruke en formel, på samme måte som for å beregne antall håndtrykk.

For å komme fram til en formel kan vi tenke oss at vi i tallrekka 1 + 2 + 3 + … + n lager delsummer der vi adderer første og siste ledd, andre og nest siste, og så videre. Det vil si at vi får delsummene (1 + n), (2 + n−1), (3 + n−2), …, (n + 1). Alle disse delsummene blir n + 1. Hvis for eksempel n er 5, får vi (1 + 5), (2 + 4), (3 + 3), (4 + 2) og (5 + 1). Alle delsummene er n + 1, altså 6.

Siden vi har n delsummer, blir den totale summen n(n + 1). Men siden vi har tatt med alle tallene to ganger, må vi dividere med 2 for å få den riktige summen av tallrekka, så formelen blir LaTeX: {\large \frac{n(n+1)}{2}}n(n+1)2. Hvis n er 5, for eksempel, får vi LaTeX: {\large \frac{5(5+1)}{2}} = {\large \frac{5 \cdot 6}{2}} = 155(5+1)2=562=15.

For å lage en kloss som bruker denne formelen, tar vi utgangspunkt i klossen i eksempel 4. All endring som behøves for å få en riktig beregning er å endre n(n − 1) til n(n + 1). Men vi tilpasser også ved å navne om variabelen håndtrykk til sum, og endre strengen "Antall personer?" til "Hva er n?", og "Antall håndtrykk er " til "Summen er ". Den nye klossen er vist i eksempel 6.

Eksempel 6:

Klossen under gjør det samme som klossen i eksempel 5, men bruker en formel til å beregne summen av tallene fra 1 til n.

Kloss der katten spør etter n, og sier summen av tallene fra 1 til n

Klikker vi på klossen i eksempel 6, og svarer 5 når katten spør etter n, svarer katten Summen er 15

Øvingsoppgave 2:

Ta utgangspunkt i klossen i eksempel 6, og endre den slik at den beregner summen fra m til n, i stedet for fra 1 til n. Verdien til m skal gis inn av brukeren.

Hint: Hvis vi lager delsummer der vi adderer første og siste ledd, andre og nest siste, og så videre, får vi (m + n), (m+1 + n−1), (m+2 + n−2), …, (n + m). Alle disse delsummene blir m + n. Totalt blir det n − (m − 1) = nm + 1 slike delsummer.

Sjekk at summen blir 45 hvis du angir at m skal være 5 og at n skal være 10.