SlideShare a Scribd company logo
1 of 27
Download to read offline
Racket
4. JAKSO
Sisällysluettelo
5A. REKURSIO (SILMUKKA)
1. Silmukat ja sivuvaikutukset
2. display-read, display-value, display-info, display-select
3. Ikuinen silmukka
4. Silmukka lopetusehdolla
5. Silmukka akkumulaattorilla
5B. REKURSIO (INDUKTIOPERIAATE)
6. Rekursio alkeistapauksen avulla
2
Rekursio
3
Funktio, joka kutsuu itse
itseään on rekursiivinen.
Rekursiolla voi tehdä silmukan
Rekursiivisen funktion avulla voidaan toteuttaa silmukka, eli saadaan
ohjelma toistamaan jotain toimintoa monta kertaa.
Jotta silmukka päättyy joskus, meillä on oltava lopetusehto (if tai cond).
Jotta silmukka ”muistaa” mitä on jo tehty, välituloksia säilytetään
funktion parametreissa.
Kutsuttaessa rekursiivista funktiota, annamme lähtötilanteen
argumentit. Kun lopetusehto toteutuu, funktiopalauttaa paluuarvon.
4
Silmukat ja sivuvaikutukset
Yksinkertaisin silmukka on ikuinen silmukka. Usein se on
ohjelmointivirhe, jossa lopetusehto puuttuu tai ehto ei koskaan toteudu.
Seuraavaksi yksinkertaisin silmukka ottaa sisäänsä kierrosten lukumäärän
ja lopettaa, kun vaadittu määrän toistoja on suoritettu.
Edellä mainitut silmukat ovat turhia, jos käytössämme on vain puhtaita
funktioita. Jos ohjelmalla on ns. sivuvaikutuksia, nämä silmukat voivat
olla myös hyödyllisiä. Sivuvaikutuksella tarkoitetaan koodia, joka ulottaa
toimintansa funktion ulkopuolelle: muuttaa globaalia muuttujaa, tuottaa
käyttäjälle ääntä tai kuvaa, kysyy käyttäjän syötettä, kirjoittaa tiedostoon
jne.
Harjoittelemme sivuvaikutuksia ja silmukoita display-read – kirjaston
avulla. Huom. Näiden funktioiden kanssa ei voi käyttää check-expect:iä!
(require teachpacks/display-read)
5
display-read
display-read-number
◦ display-read näyttää käyttäjälle kuvan/merkkijonon/luvun
(=sivuvaikutus) ja palauttaa käyttäjän editoriin kirjoittaman
merkkijonon
◦ display-read-number muuntaa annetun merkkijonon luvuksi
6
display-
read
ARGUMENTIT
PALUUARVO
kuva
”tikkataulu”
merkkijono
Asenna paketti DrRacket:issa:
File -> Package manager
Package source: teachpacks
(lopuksi paina enter)
sivuvaikutus
display-value
◦ display-value näyttää käyttäjälle kuvan/merkkijonon/luvun ja
annetun arvon (jos sen voi näyttää) ja palauttaa annetun arvon
7
display-
value
ARGUMENTIT
PALUUARVO
merkkijono
35
luku
”Tulos on:”
luku
35
sivuvaikutus
display-info
display-info-timer
8
◦ display-info näyttää käyttäjälle kuvan/merkkijonon/luvun ja palauttaa
annetun arvon
◦ display-info-timer ottaa lisäksi ajan, joka kertoo kunka kauan info-
ruutu pidetään näkyvissä)
display-
info
ARGUMENTIT PALUUARVO
lukumerkkijono
”Game over”
sivuvaikutus
”Game over”
display-select
9
◦ display-select näyttää käyttäjälle näyttää käyttäjälle
kuvan/merkkijonon/luvun sekä listan valintavaihtoehtoja
(kuvia/merkkijonoja/lukuja) ja palauttaa valitun arvon
display-
select
PALUUARVO
merkkijono
sivuvaikutus
”kyllä”
ARGUMENTIT
merkkijono
”Jatketaanko?”
lista
(list ”kyllä” ”ei”)
begin ja let
Jotta saamme funktion tekemään sivuvaikutuksia JA palauttamaan
paluuarvon, pitää muodostaa koodilohko begin:in avulla.
Begin evaluoi sen sisällä olevat lausekkeet järjestyksessä, ”hukkaa” niiden
tuottaman paluuarvon viimeistä lukuunottamatta ja palauttaa sen.
Jotta saamme talteen käyttäjän antamat syötteet, tarvitsemme lisäksi
funktion sisäisiä muuttujia. Näihin ns. lokaalit muuttujan arvot
määritellään let tai let* rakenteella (let* jos let-lauseke käyttää toista let-
lauseketta).
10
muuttujan nimi muuttujan arvo
Ikuinen silmukka laskurilla
11
(define (silmukka i)
(silmukka (add1 i))))uusi kierros
(silmukka 0)käynnistys
uusi kierros
(begin (display-info-timer i 50)
uusi i:n
arvo
i:n arvo alussa
Ikuinen silmukka
(esimerkki)
Automaattilaskuri kysyy käyttäjältä syötteitä, tallentaa ne lokaaleihin
muuttujiin (let), tutkii ovatko syötteet ok, jos ovat laskee tuloksen
(kutsuu pinta-ala funktiota) ja ilmoittaa tuloksen käyttäjälle (display-
value), ja palaa alkuun:
(define (automaattilaskuri)
(let [(a (display-read-number ”Anna kanta:”)
(b (display-read-number ”Anna korkeus:”)]
(if (and (number? a)(number? b))
(begin (display-value ”Pinta-ala on:” (pinta-ala a b))
(automaattilaskuri))
(begin (display-info ”Anna lukuja!”)
(automaattilaskuri)))))
12
Tämä älykkäämpi versio kysyy
käyttäjältä jatketaanko
parametreja ei tarvita
Silmukka laskurilla ja
lopetusehdolla
13
(define (silmukka i)
(if (<= i 0)
”tämä on valmis”
(silmukka (sub1 i)))))
lopetusehto
loppuarvo
uusi kierros
uusi i:n
arvo(silmukka 10)käynnistys
uusi kierros
(begin (<tehdään jotain>)
Silmukka laskurilla
(esimerkki)
Rekursiiviselle funktiolle annetaan ”laskuri” - argumentti, jota vähennetään
jokaisella kierroksella. Kun laskuri on nolla, silmukan suoritus päättyy.
Esim. Lähtölasku-silmukka:
(define (lähtölasku laskuri)
(if (<= laskuri 0)
(display-info-timer ”LOPPU” 50)
(begin
(display-info-timer laskuri 50)
(lähtölasku (sub1 laskuri)))))
Lähtölasku-silmukan käynnistys (10, 9, 8, 7, 6, 5, 4, 3, 2, 1, LOPPU):
(lähtölasku 10)
14
Silmukka akkumulaattorilla
Jos lisäämme silmukkaan (funktioon) yhden parametrin,
akkumulaattorin, voimme tallentaa siihen tulosta pikkuhiljaa, kierros
kierrokselta. Lopuksi voimme palauttaa akkumulaattoriin kerääntyneen
”valmiin” paluuarvon.
Esim. Tähdet-silmukka
(define (tähdet i kuva)
(if (<= i 0)
kuva
(tähdet (sub1 i)
(place-image (star (* i 5) "solid" ”aqua"))
(random 200)(random 200)
kuva)))))
Tähdet-silmukan käynnistyksessä annetaan ”akkumulaattorille”-alkuarvo
(tähdet 10 (empty-scene 200 200))
15
akkumulaattori
Silmukka laskurilla ja
akkumulaattorilla
16
(define (silmukka i tulos)
(if (<= i 0)
tulos
(silmukka (sub1 i) (f i tulos))))
lopetusehto
loppuarvo=akkumulaattori
uusi kierros
tallennetaan
akkumulaattoriin tämän
kierroksen tulos
uudet arvot
(silmukka 10 <tyhjä-tulos>)käynnistys
uusi kierros
Ympyräkuvio
(kuva tallentuu akkumulaattoriin)
(define EPÄKESKO (overlay/xy (circle 30 "outline" "black")
100 30
(circle 20 0 "transparent")))
(define (pyöritä k osa kuva laskuri)
(if (< laskuri 0)
kuva
(pyöritä (+ k 5) osa (overlay (rotate k osa) kuva) (sub1 laskuri))))
(pyöritä 5 EPÄKESKO empty-image 100)
17
akkumulaattori
Kertolaskupeli
(pisteet kerääntyvät akkumulaattoriin)
Arpoo kaksi lukua ja tallentaa ne lokaaleihin muuttujiin a ja b
(let* [(a (random 10))
(b (random 10))
(vastaus (display-read-number (kysymys a b)))]
Kysyy käyttäjältä kertolaskun vastausta, tallentaa sen muuttujaan
vastaus
Jos oikein, lisää pisteitä (pisteet on akkumulaattori) ja aloittaa uuden
kierroksen
Jos väärin, ei lisää pisteitä ja aloittaa uuden kierroksen
Lataa esimerkkikoodi tästä.
18
vaatii let*, koska vastaus tarvitsee
a:n ja b:n ja niitä vasta määritellään
Arvaa mitä numeroa ajattelen
(arvauskerrat kerääntyvät akkumulaattoriin)
Peli, jossa tietokone arpoo numeron ja pelaajaa kehoitetaan arvaamaan se.
Tietokone antaa arvauksen perusteella vinkkejä ”pienempi” tai ”suurempi”.
Toteutettu silmukan avulla.
Käyttää valintalausetta (cond)
(cond [(and (number? arvaus)(< oikea arvaus))
"pienempi"]
[(and (number? arvaus)(> oikea arvaus))
"suurempi"]
[else "anna numero"])
Kierrokset tallennetaan akkumulaattoriin ja kerrotaan lopussa käyttäjälle.
Lataa esimerkkikoodi tästä.
19
Rekursio alkeistapauksen
avulla
Joskus on tarve toteuttaa silmukoita, joissa lopputulos muodostuu
hajoita ja hallitse menetelmällä eli lähdetään jakamaan ongelmaa
pienemmäksi ja pienemmäksi, kunnes saavutetaan ns. alkeistapaus.
Rekursiota jatketaan siis kunnes alkeistapauksen ehto toteutuu ja sen
arvo palautetaan kutsujalle, joka saa valmiiksi oman tuloksensa, joka
palautetaan sen kutsujalle jne. Näin ei tarvita ”akkumulaattoria” vaan
lopullinen vastaus saadaan kun päästään ensimmäiseen kutsujaan.
Esimerkiksi fraktaaleita piirrettäessa, aloitetaan isosta kuviosta,
siirrytään pienempään, kunnes saavutetaan kuvion pienin piirrettävä
osa.
20
Rekursio - alkeistapauksella
2121
(define (r-funktio muuttuja)
(if (<alkeistapaus?>)
alkeistapaus
(f muuttuja (r-funktio (g muuttuja))
lopetusehto
alkeistapaus
uusi kierros
uusi kierros uudella
muuttujan arvolla
(r-funktio 10)käynnistys
uusi kierros
Tämä funktio jää odottamaan
lopputuloksia
Pienenevät pallot
(define (pienenevät-pallot säde väri)
(if (<= säde 1)
(circle säde "solid" väri)
(beside
(circle säde "solid" väri)
(pienenevät-pallot (* säde (/ 4 5)) väri))))
(pienenevät-pallot 30 "red")
22
Alkeistapaus :
pienin piirrettävä
pallo
Sierpinskin kolmio – fraktaali
(require 2htdp/image)
(define (sierpinski koko)
(if (<= koko 2)
(triangle koko "outline" "blue")
(overlay (triangle koko "outline" "blue")
(let [(p-kolmio (sierpinski (/ koko 2)))]
(above p-kolmio
(beside p-kolmio p-kolmio))))))
(sierpinski 500)
23
Alkeistapaus :
pienin piirrettävä
kolmio
Vaatimattoman pojan palkka
Poika pyysi palkaksi ensimmäisenä päivänä 2snt, seuraavina päivinä aina 2 kertaa
edellisen päivän palkka 20 päivän ajan. Kuinka paljon hän sai palkkaa yhteensä?
(define (laske-palkka p1 pv)
(if (<= pv 0)
0
(+ (expt p1 pv)
(laske-palkka p1 (sub1 pv)))))
(laske-palkka 2 20)
24
Alkeistapaus : 0 päivää töissä -> palkka 0 snt
ensimmäisen päivän palkka
päivä jota lasketaan
Lasketaan päivän palkka
ja siirrytään seuraavaan
päivään
Vinkkejä viikkotehtävään
Tee oma versiosi jostakin viikon harjoitustehtävästä: laskuautomaatista,
päässälaskutestistä tai kuvatehtävästä. Älä yritä tehdä liian
monimutkaista ohjelmaa, muista että muut kurssilaiset arvoivat työsi!
math-utils – kirjastosta löytyvät funktiot pyöristämiseen sekä pinta-alan
ja tilavuuden yksiköiden ilmoittamiseen.
Huomaa, että display-read – kirjastolla on eri nimi WeSchemessä!
(require wescheme/dhnSHUnLTh)
Huomaa, että math-utils –kirjastolla on eri nimi WeSchemessä!
(require wescheme/lenBmnorzi)
KOODIAAPINEN MOOC - SYKSY 2015
Vinkkejä viikkotehtävään
Koska display-read –kirjaston tuottamia sivuvaikutuksia ei voi testata
automatisoidusti check-expect:ien avulla, on hyvä rajoittaa niiden
käyttö vain yhteen kohtaan koodia ja pitää muu koodi ”puhtaana”
sivuvaikutuksista.
1) Tee apufunktiosi puhtaina funktioina, ilman sivuvaikutuksia, ja testaa
ne check-expectien avulla.
2) Käytä sivuvaikutuksia vain yhdessä funktiossa, siis siinä, joka
toteuttaa silmukan:
◦ kysyy syötteet käyttäjältä (display-readin avulla), tallentaa lokaaleihin
muuttujiin
◦ tarkistaa, että syötteet ovat ok (if, cond...)
◦ kutsuu apufunktioita, jotka tekevät ”itse asian” ( nämä on hyvin testattu
check-expect:in avulla!!!)
◦ Ilmoittaa käyttäjälle tuloksen (display-readin avulla)
KOODIAAPINEN MOOC - SYKSY 2015
Vinkkejä viikkotehtäviin
KOODIAAPINEN MOOC - SYKSY 2015
(define (automaattilaskuri)
(let [(a (display-read-number ”Anna kanta:”)
(b (display-read-number ”Anna korkeus:”)]
(if (and (number? a)(number? b))
(begin (display-value ”Pinta-ala on:” (pinta-ala a b))
(automaattilaskuri))
(begin (display-info ”Anna lukuja!”)
(automaattilaskuri)))))
Sivuvaikutuksia sisältävä silmukka:
;; pinta-ala : Luku Luku -> Luku
(define (pinta-ala a b)
(* a b))
(check-expect (pinta-ala 10 30)
300)
Puhtaat funktiot (apufunktiot):
sivuvaikutukset
Ei sivuvaikutuksia.
Testit!
Ei testejä

More Related Content

What's hot

Racket MOOC - viikko 3
Racket MOOC - viikko 3Racket MOOC - viikko 3
Racket MOOC - viikko 3Tiina Partanen
 
Racket jatko 6. Listat
Racket jatko 6. ListatRacket jatko 6. Listat
Racket jatko 6. ListatTiina Partanen
 
Racket perusteet - Sovellukset A
Racket perusteet - Sovellukset ARacket perusteet - Sovellukset A
Racket perusteet - Sovellukset ATiina Partanen
 
Racket MOOC - 1. viikko
Racket MOOC - 1. viikkoRacket MOOC - 1. viikko
Racket MOOC - 1. viikkoTiina Partanen
 
Racket jatko 6. oppitunti
Racket jatko  6. oppituntiRacket jatko  6. oppitunti
Racket jatko 6. oppituntiTiina Partanen
 

What's hot (8)

Racket Turtle
Racket TurtleRacket Turtle
Racket Turtle
 
Racket MOOC - viikko 3
Racket MOOC - viikko 3Racket MOOC - viikko 3
Racket MOOC - viikko 3
 
Racket MOOC - jakso 6
Racket MOOC -  jakso 6Racket MOOC -  jakso 6
Racket MOOC - jakso 6
 
Racket jatko 6. Listat
Racket jatko 6. ListatRacket jatko 6. Listat
Racket jatko 6. Listat
 
Racket perusteet - Sovellukset A
Racket perusteet - Sovellukset ARacket perusteet - Sovellukset A
Racket perusteet - Sovellukset A
 
Racket MOOC - 1. viikko
Racket MOOC - 1. viikkoRacket MOOC - 1. viikko
Racket MOOC - 1. viikko
 
Racket MOOC - jakso 5
Racket MOOC - jakso 5Racket MOOC - jakso 5
Racket MOOC - jakso 5
 
Racket jatko 6. oppitunti
Racket jatko  6. oppituntiRacket jatko  6. oppitunti
Racket jatko 6. oppitunti
 

Viewers also liked

Racket mooc 2017 - yleistä
Racket mooc 2017 -  yleistäRacket mooc 2017 -  yleistä
Racket mooc 2017 - yleistäTiina Partanen
 
Racket mooc 2017 - aikataulu
Racket mooc 2017 -  aikatauluRacket mooc 2017 -  aikataulu
Racket mooc 2017 - aikatauluTiina Partanen
 
Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)Tiina Partanen
 
Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)Tiina Partanen
 

Viewers also liked (6)

Racket mooc 2017 - yleistä
Racket mooc 2017 -  yleistäRacket mooc 2017 -  yleistä
Racket mooc 2017 - yleistä
 
Racket mooc 2017 - aikataulu
Racket mooc 2017 -  aikatauluRacket mooc 2017 -  aikataulu
Racket mooc 2017 - aikataulu
 
K2017aikataulu
K2017aikatauluK2017aikataulu
K2017aikataulu
 
Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)
 
Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)
 
Aikataulusyksy
AikataulusyksyAikataulusyksy
Aikataulusyksy
 

More from Tiina Partanen

Computational Thinking as an Emergent Learning Trajectory of Mathematics
Computational Thinking as an Emergent Learning Trajectory of MathematicsComputational Thinking as an Emergent Learning Trajectory of Mathematics
Computational Thinking as an Emergent Learning Trajectory of MathematicsTiina Partanen
 
Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Tiina Partanen
 
Ohjelmoinnin historiaa
Ohjelmoinnin historiaaOhjelmoinnin historiaa
Ohjelmoinnin historiaaTiina Partanen
 
Koodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynoteKoodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynoteTiina Partanen
 
Koodauksen ensiaskeleet
Koodauksen ensiaskeleetKoodauksen ensiaskeleet
Koodauksen ensiaskeleetTiina Partanen
 
Racket MOOC - viikko 6
Racket MOOC - viikko 6Racket MOOC - viikko 6
Racket MOOC - viikko 6Tiina Partanen
 
Racket jatko 7. oppitunti
Racket jatko 7. oppituntiRacket jatko 7. oppitunti
Racket jatko 7. oppituntiTiina Partanen
 
Koodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketKoodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketTiina Partanen
 

More from Tiina Partanen (12)

Computational Thinking as an Emergent Learning Trajectory of Mathematics
Computational Thinking as an Emergent Learning Trajectory of MathematicsComputational Thinking as an Emergent Learning Trajectory of Mathematics
Computational Thinking as an Emergent Learning Trajectory of Mathematics
 
Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)
 
Ohjelmoinnin historiaa
Ohjelmoinnin historiaaOhjelmoinnin historiaa
Ohjelmoinnin historiaa
 
Koodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynoteKoodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynote
 
Kurkistus koodaukseen
Kurkistus koodaukseenKurkistus koodaukseen
Kurkistus koodaukseen
 
Racket MOOC jakso 7
Racket MOOC jakso 7Racket MOOC jakso 7
Racket MOOC jakso 7
 
Legorobottialkeet
LegorobottialkeetLegorobottialkeet
Legorobottialkeet
 
Lapset koodaa?
Lapset koodaa?Lapset koodaa?
Lapset koodaa?
 
Koodauksen ensiaskeleet
Koodauksen ensiaskeleetKoodauksen ensiaskeleet
Koodauksen ensiaskeleet
 
Racket MOOC - viikko 6
Racket MOOC - viikko 6Racket MOOC - viikko 6
Racket MOOC - viikko 6
 
Racket jatko 7. oppitunti
Racket jatko 7. oppituntiRacket jatko 7. oppitunti
Racket jatko 7. oppitunti
 
Koodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketKoodiaapinen MOOC - Racket
Koodiaapinen MOOC - Racket
 

Racket MOOC (kevät 2016) - jakso 4

  • 2. Sisällysluettelo 5A. REKURSIO (SILMUKKA) 1. Silmukat ja sivuvaikutukset 2. display-read, display-value, display-info, display-select 3. Ikuinen silmukka 4. Silmukka lopetusehdolla 5. Silmukka akkumulaattorilla 5B. REKURSIO (INDUKTIOPERIAATE) 6. Rekursio alkeistapauksen avulla 2
  • 3. Rekursio 3 Funktio, joka kutsuu itse itseään on rekursiivinen.
  • 4. Rekursiolla voi tehdä silmukan Rekursiivisen funktion avulla voidaan toteuttaa silmukka, eli saadaan ohjelma toistamaan jotain toimintoa monta kertaa. Jotta silmukka päättyy joskus, meillä on oltava lopetusehto (if tai cond). Jotta silmukka ”muistaa” mitä on jo tehty, välituloksia säilytetään funktion parametreissa. Kutsuttaessa rekursiivista funktiota, annamme lähtötilanteen argumentit. Kun lopetusehto toteutuu, funktiopalauttaa paluuarvon. 4
  • 5. Silmukat ja sivuvaikutukset Yksinkertaisin silmukka on ikuinen silmukka. Usein se on ohjelmointivirhe, jossa lopetusehto puuttuu tai ehto ei koskaan toteudu. Seuraavaksi yksinkertaisin silmukka ottaa sisäänsä kierrosten lukumäärän ja lopettaa, kun vaadittu määrän toistoja on suoritettu. Edellä mainitut silmukat ovat turhia, jos käytössämme on vain puhtaita funktioita. Jos ohjelmalla on ns. sivuvaikutuksia, nämä silmukat voivat olla myös hyödyllisiä. Sivuvaikutuksella tarkoitetaan koodia, joka ulottaa toimintansa funktion ulkopuolelle: muuttaa globaalia muuttujaa, tuottaa käyttäjälle ääntä tai kuvaa, kysyy käyttäjän syötettä, kirjoittaa tiedostoon jne. Harjoittelemme sivuvaikutuksia ja silmukoita display-read – kirjaston avulla. Huom. Näiden funktioiden kanssa ei voi käyttää check-expect:iä! (require teachpacks/display-read) 5
  • 6. display-read display-read-number ◦ display-read näyttää käyttäjälle kuvan/merkkijonon/luvun (=sivuvaikutus) ja palauttaa käyttäjän editoriin kirjoittaman merkkijonon ◦ display-read-number muuntaa annetun merkkijonon luvuksi 6 display- read ARGUMENTIT PALUUARVO kuva ”tikkataulu” merkkijono Asenna paketti DrRacket:issa: File -> Package manager Package source: teachpacks (lopuksi paina enter) sivuvaikutus
  • 7. display-value ◦ display-value näyttää käyttäjälle kuvan/merkkijonon/luvun ja annetun arvon (jos sen voi näyttää) ja palauttaa annetun arvon 7 display- value ARGUMENTIT PALUUARVO merkkijono 35 luku ”Tulos on:” luku 35 sivuvaikutus
  • 8. display-info display-info-timer 8 ◦ display-info näyttää käyttäjälle kuvan/merkkijonon/luvun ja palauttaa annetun arvon ◦ display-info-timer ottaa lisäksi ajan, joka kertoo kunka kauan info- ruutu pidetään näkyvissä) display- info ARGUMENTIT PALUUARVO lukumerkkijono ”Game over” sivuvaikutus ”Game over”
  • 9. display-select 9 ◦ display-select näyttää käyttäjälle näyttää käyttäjälle kuvan/merkkijonon/luvun sekä listan valintavaihtoehtoja (kuvia/merkkijonoja/lukuja) ja palauttaa valitun arvon display- select PALUUARVO merkkijono sivuvaikutus ”kyllä” ARGUMENTIT merkkijono ”Jatketaanko?” lista (list ”kyllä” ”ei”)
  • 10. begin ja let Jotta saamme funktion tekemään sivuvaikutuksia JA palauttamaan paluuarvon, pitää muodostaa koodilohko begin:in avulla. Begin evaluoi sen sisällä olevat lausekkeet järjestyksessä, ”hukkaa” niiden tuottaman paluuarvon viimeistä lukuunottamatta ja palauttaa sen. Jotta saamme talteen käyttäjän antamat syötteet, tarvitsemme lisäksi funktion sisäisiä muuttujia. Näihin ns. lokaalit muuttujan arvot määritellään let tai let* rakenteella (let* jos let-lauseke käyttää toista let- lauseketta). 10 muuttujan nimi muuttujan arvo
  • 11. Ikuinen silmukka laskurilla 11 (define (silmukka i) (silmukka (add1 i))))uusi kierros (silmukka 0)käynnistys uusi kierros (begin (display-info-timer i 50) uusi i:n arvo i:n arvo alussa
  • 12. Ikuinen silmukka (esimerkki) Automaattilaskuri kysyy käyttäjältä syötteitä, tallentaa ne lokaaleihin muuttujiin (let), tutkii ovatko syötteet ok, jos ovat laskee tuloksen (kutsuu pinta-ala funktiota) ja ilmoittaa tuloksen käyttäjälle (display- value), ja palaa alkuun: (define (automaattilaskuri) (let [(a (display-read-number ”Anna kanta:”) (b (display-read-number ”Anna korkeus:”)] (if (and (number? a)(number? b)) (begin (display-value ”Pinta-ala on:” (pinta-ala a b)) (automaattilaskuri)) (begin (display-info ”Anna lukuja!”) (automaattilaskuri))))) 12 Tämä älykkäämpi versio kysyy käyttäjältä jatketaanko parametreja ei tarvita
  • 13. Silmukka laskurilla ja lopetusehdolla 13 (define (silmukka i) (if (<= i 0) ”tämä on valmis” (silmukka (sub1 i))))) lopetusehto loppuarvo uusi kierros uusi i:n arvo(silmukka 10)käynnistys uusi kierros (begin (<tehdään jotain>)
  • 14. Silmukka laskurilla (esimerkki) Rekursiiviselle funktiolle annetaan ”laskuri” - argumentti, jota vähennetään jokaisella kierroksella. Kun laskuri on nolla, silmukan suoritus päättyy. Esim. Lähtölasku-silmukka: (define (lähtölasku laskuri) (if (<= laskuri 0) (display-info-timer ”LOPPU” 50) (begin (display-info-timer laskuri 50) (lähtölasku (sub1 laskuri))))) Lähtölasku-silmukan käynnistys (10, 9, 8, 7, 6, 5, 4, 3, 2, 1, LOPPU): (lähtölasku 10) 14
  • 15. Silmukka akkumulaattorilla Jos lisäämme silmukkaan (funktioon) yhden parametrin, akkumulaattorin, voimme tallentaa siihen tulosta pikkuhiljaa, kierros kierrokselta. Lopuksi voimme palauttaa akkumulaattoriin kerääntyneen ”valmiin” paluuarvon. Esim. Tähdet-silmukka (define (tähdet i kuva) (if (<= i 0) kuva (tähdet (sub1 i) (place-image (star (* i 5) "solid" ”aqua")) (random 200)(random 200) kuva))))) Tähdet-silmukan käynnistyksessä annetaan ”akkumulaattorille”-alkuarvo (tähdet 10 (empty-scene 200 200)) 15 akkumulaattori
  • 16. Silmukka laskurilla ja akkumulaattorilla 16 (define (silmukka i tulos) (if (<= i 0) tulos (silmukka (sub1 i) (f i tulos)))) lopetusehto loppuarvo=akkumulaattori uusi kierros tallennetaan akkumulaattoriin tämän kierroksen tulos uudet arvot (silmukka 10 <tyhjä-tulos>)käynnistys uusi kierros
  • 17. Ympyräkuvio (kuva tallentuu akkumulaattoriin) (define EPÄKESKO (overlay/xy (circle 30 "outline" "black") 100 30 (circle 20 0 "transparent"))) (define (pyöritä k osa kuva laskuri) (if (< laskuri 0) kuva (pyöritä (+ k 5) osa (overlay (rotate k osa) kuva) (sub1 laskuri)))) (pyöritä 5 EPÄKESKO empty-image 100) 17 akkumulaattori
  • 18. Kertolaskupeli (pisteet kerääntyvät akkumulaattoriin) Arpoo kaksi lukua ja tallentaa ne lokaaleihin muuttujiin a ja b (let* [(a (random 10)) (b (random 10)) (vastaus (display-read-number (kysymys a b)))] Kysyy käyttäjältä kertolaskun vastausta, tallentaa sen muuttujaan vastaus Jos oikein, lisää pisteitä (pisteet on akkumulaattori) ja aloittaa uuden kierroksen Jos väärin, ei lisää pisteitä ja aloittaa uuden kierroksen Lataa esimerkkikoodi tästä. 18 vaatii let*, koska vastaus tarvitsee a:n ja b:n ja niitä vasta määritellään
  • 19. Arvaa mitä numeroa ajattelen (arvauskerrat kerääntyvät akkumulaattoriin) Peli, jossa tietokone arpoo numeron ja pelaajaa kehoitetaan arvaamaan se. Tietokone antaa arvauksen perusteella vinkkejä ”pienempi” tai ”suurempi”. Toteutettu silmukan avulla. Käyttää valintalausetta (cond) (cond [(and (number? arvaus)(< oikea arvaus)) "pienempi"] [(and (number? arvaus)(> oikea arvaus)) "suurempi"] [else "anna numero"]) Kierrokset tallennetaan akkumulaattoriin ja kerrotaan lopussa käyttäjälle. Lataa esimerkkikoodi tästä. 19
  • 20. Rekursio alkeistapauksen avulla Joskus on tarve toteuttaa silmukoita, joissa lopputulos muodostuu hajoita ja hallitse menetelmällä eli lähdetään jakamaan ongelmaa pienemmäksi ja pienemmäksi, kunnes saavutetaan ns. alkeistapaus. Rekursiota jatketaan siis kunnes alkeistapauksen ehto toteutuu ja sen arvo palautetaan kutsujalle, joka saa valmiiksi oman tuloksensa, joka palautetaan sen kutsujalle jne. Näin ei tarvita ”akkumulaattoria” vaan lopullinen vastaus saadaan kun päästään ensimmäiseen kutsujaan. Esimerkiksi fraktaaleita piirrettäessa, aloitetaan isosta kuviosta, siirrytään pienempään, kunnes saavutetaan kuvion pienin piirrettävä osa. 20
  • 21. Rekursio - alkeistapauksella 2121 (define (r-funktio muuttuja) (if (<alkeistapaus?>) alkeistapaus (f muuttuja (r-funktio (g muuttuja)) lopetusehto alkeistapaus uusi kierros uusi kierros uudella muuttujan arvolla (r-funktio 10)käynnistys uusi kierros Tämä funktio jää odottamaan lopputuloksia
  • 22. Pienenevät pallot (define (pienenevät-pallot säde väri) (if (<= säde 1) (circle säde "solid" väri) (beside (circle säde "solid" väri) (pienenevät-pallot (* säde (/ 4 5)) väri)))) (pienenevät-pallot 30 "red") 22 Alkeistapaus : pienin piirrettävä pallo
  • 23. Sierpinskin kolmio – fraktaali (require 2htdp/image) (define (sierpinski koko) (if (<= koko 2) (triangle koko "outline" "blue") (overlay (triangle koko "outline" "blue") (let [(p-kolmio (sierpinski (/ koko 2)))] (above p-kolmio (beside p-kolmio p-kolmio)))))) (sierpinski 500) 23 Alkeistapaus : pienin piirrettävä kolmio
  • 24. Vaatimattoman pojan palkka Poika pyysi palkaksi ensimmäisenä päivänä 2snt, seuraavina päivinä aina 2 kertaa edellisen päivän palkka 20 päivän ajan. Kuinka paljon hän sai palkkaa yhteensä? (define (laske-palkka p1 pv) (if (<= pv 0) 0 (+ (expt p1 pv) (laske-palkka p1 (sub1 pv))))) (laske-palkka 2 20) 24 Alkeistapaus : 0 päivää töissä -> palkka 0 snt ensimmäisen päivän palkka päivä jota lasketaan Lasketaan päivän palkka ja siirrytään seuraavaan päivään
  • 25. Vinkkejä viikkotehtävään Tee oma versiosi jostakin viikon harjoitustehtävästä: laskuautomaatista, päässälaskutestistä tai kuvatehtävästä. Älä yritä tehdä liian monimutkaista ohjelmaa, muista että muut kurssilaiset arvoivat työsi! math-utils – kirjastosta löytyvät funktiot pyöristämiseen sekä pinta-alan ja tilavuuden yksiköiden ilmoittamiseen. Huomaa, että display-read – kirjastolla on eri nimi WeSchemessä! (require wescheme/dhnSHUnLTh) Huomaa, että math-utils –kirjastolla on eri nimi WeSchemessä! (require wescheme/lenBmnorzi) KOODIAAPINEN MOOC - SYKSY 2015
  • 26. Vinkkejä viikkotehtävään Koska display-read –kirjaston tuottamia sivuvaikutuksia ei voi testata automatisoidusti check-expect:ien avulla, on hyvä rajoittaa niiden käyttö vain yhteen kohtaan koodia ja pitää muu koodi ”puhtaana” sivuvaikutuksista. 1) Tee apufunktiosi puhtaina funktioina, ilman sivuvaikutuksia, ja testaa ne check-expectien avulla. 2) Käytä sivuvaikutuksia vain yhdessä funktiossa, siis siinä, joka toteuttaa silmukan: ◦ kysyy syötteet käyttäjältä (display-readin avulla), tallentaa lokaaleihin muuttujiin ◦ tarkistaa, että syötteet ovat ok (if, cond...) ◦ kutsuu apufunktioita, jotka tekevät ”itse asian” ( nämä on hyvin testattu check-expect:in avulla!!!) ◦ Ilmoittaa käyttäjälle tuloksen (display-readin avulla) KOODIAAPINEN MOOC - SYKSY 2015
  • 27. Vinkkejä viikkotehtäviin KOODIAAPINEN MOOC - SYKSY 2015 (define (automaattilaskuri) (let [(a (display-read-number ”Anna kanta:”) (b (display-read-number ”Anna korkeus:”)] (if (and (number? a)(number? b)) (begin (display-value ”Pinta-ala on:” (pinta-ala a b)) (automaattilaskuri)) (begin (display-info ”Anna lukuja!”) (automaattilaskuri))))) Sivuvaikutuksia sisältävä silmukka: ;; pinta-ala : Luku Luku -> Luku (define (pinta-ala a b) (* a b)) (check-expect (pinta-ala 10 30) 300) Puhtaat funktiot (apufunktiot): sivuvaikutukset Ei sivuvaikutuksia. Testit! Ei testejä