Luku 7: Ohjelmoinnin alkeet
7.2 Toisto
Ohjeet
Edellisessä osiossa oli käytössä vain yksi operaatio: laske kahden lapun lukujen summa ja kirjoita se kolmannelle lapulle.
Kerro lapselle, että nyt käytössä on seuraavat uudet operaatiot:
Uusi komento 1: Lapun luvun kasvattaminen. Nyt voi kirjoittaa esimerkiksi
a + 2 → a
Tämä komento kasvattaa $a$:ta (siis lapun $a$ lukua) kahdella.
Uusi komento 2: Lappuun luvun kirjoittaminen. Nyt voi kirjoittaa esimerkiksi
3 → a
Tämä komento korvaa lapun $a$ luvun kolmosella. Saa myös kirjoittaa
b → a
mikä kopioi lapun $b$ luvun lappuun $a$. Tämä ei vaikuta lapun $b$ lukuun.
Uusi komento 3: Toisto. Tämän komennon avulla esimerkiksi komentosarjan
a + b → c
a + b → c
a + b → c
a + b → c
saa kirjoittaa muodossa
toista 4:
a + b → c
(Tarvitsemme jonkin tavan merkitä, mitkä komennot toistetaan ja mitä ei. Tässä käytetään sisennyksiä.)
Toistoon saa laittaa myös lapun nimen luvun sijasta. Esimerkiksi jos lapussa $b$ lukee $3$, niin
toista b:
a + a → a
tarkoittaa samaa kuin
a + a → a
a + a → a
a + a → a
(On monitulkintaista, mitä tapahtuu, jos lapun $b$ lukua olisi muutettu toistamisen aikana. Sano, että näin ei saa tehdä: lapun $b$ lukua ei saa muuttaa, jos sitä käytetään toistamisen määrän kirjoittamiseen.)
Aktiviteetti 1: komentojen ymmärrys
Testaa uusien komentojen ymmärrystä seuraavasti: Kirjoita lapulle $a$ luku $3$ ja lapulle $b$ luku $2$. Kysy lapselta, mitä seuraavat kolme komentosarjaa tekevät. Keksi lisää, jos nämä tuottavat vaikeuksia.
a + b → a
4 → b
b + 2 → a
toista 4:
a + b → b
a + b → a
1 → b
toista a:
b + b → b
(Ensimmäisen sarjan lopuksi $a$:ssa lukee $6$ ja $b$:ssä $4$. Toisessa sarjassa $a$:ssa lukee $3$ ja $b$:ssä $14$. Kolmannessa sarjassa $a$:ssa lukee $5$ ja $b$:ssä $32$.)
Aktiviteetti 2: monimutkaisempia tehtäviä
Pyydä lasta kirjoittamaan kullekin seuraavista tehtävistä komentosarja, joka ratkaisee sen. Voit konkreettisuuden vuoksi kirjoittaa lappuihin joitakin lukuja etukäteen, mutta kuten edellisessä osiossa, komentosarjojen pitää toimia kaikissa tapauksissa.
- Pöydällä on kolme lappua, joista kahteen on kirjoitettu luvut. Tavoitteena on vaihtaa näiden lappujen luvut. (Kolmannessa lapussa saa olla lopussa mitä vain.)
- Pöydällä on kolme lappua. Tavoitteena on kirjoittaa lappujen $a$ ja $b$ lukujen kertolasku lappuun $c$.
- Pöydällä on kaksi tyhjää lappua. Tavoitteena on kirjoittaa komentosarja, jonka suorittamalla laskun $1 + 2 + 3 + \ldots + 100$ vastaus ilmaantuu jommallekummalle lapulle.
Aktiviteetti 3: mahdollisimman suuri luku
Pöydällä on kolme lappua, joissa jokaisessa lukee aluksi $1$. Lapsen tavoitteena on kirjoittaa komentosarja, jonka suorittamalla saadaan mahdollisimman suuri luku.
Komentosarjalla on kuitenkin seuraavat rajoitteet:
- Siinä saa olla enintään viisi riviä.
- Siinä saa käyttää vain kirjaimia, ei numeroita. Siis esimerkiksi komennot $1000 \to a$, $a + 1000 \to b$ tai “toista 1000:” eivät ole sallittuja.
Selitys
Toisto on hyödyllinen komento. Sillä saa kirjoitettua pitkiäkin komentosarjoja lyhyesti. Sen avulla voi myös tuottaa hyvin suuria lukuja.
Tässä osiossa esiteltiin myös pari muuta uutta komentoa. Uusilla komennoilla saa tehtyä asioita, joita pelkästään yhteenlaskulla ei saanut, kuten esimerkiksi kertolaskun.
Edelleen on kuitenkin ongelmia, joita pelkästään näillä komennoilla ei saa ratkaistua. Esimerkiksi vähennyslasku, jakolasku ja kahdesta lapusta pienimmän luvun kopiointi eivät vielä onnistu. Seuraavassa osiossa esitellään vielä uusia komentoja, joiden avulla nämä saadaan ratkaistua.
Ratkaisuja
Lappujen $a$ ja $b$ luvut voi vaihtaa näin:
a → c
b → a
c → b
Kertolasku onnistuu seuraavasti:
0 → c
toista a:
b + c → c
Laskun $1 + 2 + \ldots + 100$ laskeminen onnistuu näin:
0 → a
1 → b
toista 100:
a + b → a
b + 1 → b
Tässä $b$ käy läpi luvut $1, 2, \ldots , 100$ (ja aivan lopuksi $101$), ja nämä arvot lisätään $a$:han yksitellen.
Suuren luvun kirjoittamiseen paras ratkaisu vaikuttaa olevan seuraava:
a + a → a
a + a → b
toista b:
toista b:
a + a → a
Tässä lapun $b$ luvuksi muodostuu $4$, joten viimeisen rivin komento $a + a \to a$ toistetaan $16$ kertaa. Koko komentosarjan aikana lapun $a$ luku tuplataan siis $17$ kertaa, ja siellä siten on lopuksi luku $2^{17} = 131\ 072$.
(Lapsi tuskin keksii juuri tätä ratkaisua itse, mutta on myös muita ratkaisuja, joilla saa muodostettua sataa tai tuhatta suuremman luvun.)
Jos rivejä saisi käyttää viiden sijasta kuusi, olisi mahdollista kirjoittaa paljon suurempia lukuja: ainakin yli $10^{100}$!