12
Racket 5. VIIKKO

Racket MOOC viikko 5

Embed Size (px)

Citation preview

Page 1: Racket MOOC viikko 5

Racket 5. VIIKKO

Page 2: Racket MOOC viikko 5

2

Silmukat – Higher Order funktiot

Jos tehtävänä on tehdä ennalta tiedetty määrä toistoja, voidaan käyttää Higher Order – funktioita toteuttamaan silmukka.

Higher Order – funktiot ovat funktioita, jotka voivat ottaa toisen funktion argumenttina (tavalliset funktiot ovat First Order – funktioita).

Racket:in Higer Order – funktiot käsittelevät tietota listojen muodossa. Tällä oppitunnilla tutustumme Higher Order – funktioihin: map, foldl ja foldr.

Page 3: Racket MOOC viikko 5

3

1. ListaLista on tietorakenne, johon voi tallentaa mitä tahansa tietoa. Tyhjään listaan viitataan Racket-kielessä sanalla empty tai symbolilla ’().

Lista luodaan list – funktion avulla:

(list 1 2 3 4 5 6)

Valmiiseen listaan voidaan lisätä uusi alkio cons – funktion avulla:

(cons 7 (list 1 2 3 4 5 6)) -> (list 7 1 2 3 4 5 6)

cons lisää uuden alkion aina listan alkuun. Listan ensimmäisen alkion voi ottaa listasta first – funktion avulla (myös second, third...):

(first (list 7 1 2 3 4 5 6)) -> 7

Listan loppu saadaan rest – funktion avulla (esimmäinen alkio poistetaan).

(rest (list 7 1 2 3 4 5 6)) -> (list 1 2 3 4 5 6)

Page 4: Racket MOOC viikko 5

4

Lista (jatkuu...) Kaksi listaa voidaan yhdistää append – funktion avulla.

(append (list 1 2 3)(list 4 5 6))-> (list 1 2 3 4 5 6)

Listan pituuden voi kysyä length – funktion avulla

(length (list 1 2 3 4)) -> 4

Predikaatti tyhjän listan tunnistamiseen on empty?

(empty? ’()) -> #true

(empty? (list 1 2)) -> #false

Listassa voi olla mitä tahansa (merkkijonoja, kuvia, listoja, totuusarvoja...):

(list 3 ”Tiina” (list 1 2 3) #t)

Page 5: Racket MOOC viikko 5

5

rangeRange – funktio palauttaa aritmeettisen lukujonon listan muodossa. Sille annetaan argumentiksi luku josta lähdetään, luku johon lopetataan sekä askel

(range 0 10 1) -> (list 0 1 2 3 4 5 6 7 8 9)

(range 5 30 5) -> (list 5 10 15 20 25)

Askel voi olla myös negatiivinen

(range 30 5 -5) -> (list 25 20 15 10 5)

Käytämme tätä apuna Higher Order – funktioiden kanssa

Page 6: Racket MOOC viikko 5

6

map map on Higher Order – funktio, joka ottaa argumenttina funktion sekä listan ja syöttää listan alkiot yksi kerrallaan funktiolle. map palauttaa saadut paluuarvot listan muodossa. Esim. neliö-funktio (sqr)

(map sqr (list 1 2 3 4 5)) -> (list 1 4 9 16 25)

map:ille on aivan sama mitä funktio tekee ja mitä listassa on. Voimme esim. tehdä listan tähtikuvia. Teemme ensin apufunktion tähti, jolla on yksi parametri (koko):

(define (tähti koko)

(star koko ”solid” ”red”))

(map tähti (list 5 10 15 20 25 30))

->

Listassa tähtien koot

Huom!Tämä esimerkki vaatii ISL-kielen

Page 7: Racket MOOC viikko 5

7

foldl ja foldr foldl ja foldr ottavat myös argumenttina funktion sekä listan mutta sen lisäksi ns. pohja-arvon. Nämä funktiot palauttavat yhden arvon (ei listaa). Esim. Voisimme laskea yhteen listan alkiot (pohja-arvona nolla):

(foldl + 0 (list 1 2 3 4 5 6 7)) -> 28

Myös nämä funktiot voivat käsitellä mitä tahansa arvoja esim. kuvia. Voimme esim. tehdä sisäkkäisiä ympyröitä. Teemme ensin apufunktio ”ympyrä”:nn avulla listan eri kokoisia ympyröitä ja sitten ”taittelemme” ne päällekkäin käyttämällä foldl:ia ja overlay:tä:

(define (ympyrä koko)

(circle koko ”outline” ”black”))

(map ympyrä (list 5 10 15 20 25 30)) ->

(foldl overlay empty-image

(map ympyrä (list 5 10 15 20 25 30))) ->

Huom!Tämä esimerkki vaatii ISL-kielen

Page 8: Racket MOOC viikko 5

8

Racket Turtle Listojen ja toistorakenteiden opetteluun kehitetty kirjasto

(require teachpacks/racket-turtle)

Vaatii teachpacks – paketin asentamisen.

Toimii myös WeSchemessä (eri niminen kirjasto)

Tarjoaa helpon tavan kokeilla toistoa (repeat)

Sisältää peilauksen sekä laimasintoiminnon

Page 9: Racket MOOC viikko 5

9

Vinkkejä viikkotehtävään (1)Tärkeintä tällä viikolla on leikkiä, kokeilla, ihmetellä ja pitää hauskaa. Leiki väreillä ja muodoilla.

Voit tehdä silmukkataidetta joko Racket Turtle:lla tai 2htdp/image-kirjaston ja map/foldl/foldr/range – avulla. Voit tehdä myös niin, että teet ensin taustakuvan 2htdp/image-kirjaston avulla ja asetat sen Racket Turtlen taustakuvaksi ja piirrät vielä Turtle-juttuja sen päälle. Ole luova!

Page 10: Racket MOOC viikko 5

10

Vinkkejä viikkotehtävään (2) Tässä on ensin tehty 2htdp/imagella kuva ja piirretty Turtlella viivoja päälle (tässä silmukkaosuus on taustakuvassa, eli random kohdissa random kokoisia laatioita silmukan avulla).

Muista myös, että voit käyttää ehto- ja valintalauseita siinä funktiossa joka annetaan foldl/foldr:lle. Tässä on piirretty random kokoisia ja värisiä ympyröitä ja sijoitettu place-imagen ja cond:in avulla kolmeen eri kohtaan ympyrän muotoon.

Page 11: Racket MOOC viikko 5

11

Silmukat – rekursion avulla

Tällä kurssilla ei ehditä käsitellä sellaisia silmukoita, joiden toistojen määrä ei ole ennalta tiedossa. Näissä tilanteissa käytettäisiin rekursiivista funktiota, eli sellaista funktiota, joka kutsuu itse itseään ja lopettaa toimintansa vasta, kun ns. lopetusehto toteutuu (if tai cond).

Rekursiiviset funktiot käsitellään Koodausta kouluun - materiaalin osiossa Oppitunti 5B. Voit tutustua niihin itsenäisesti tämän kurssin jälkeen. Samassa yhteydessä käsitellään myös lokaalien muuttujien käyttö.

Seuraavalla sivulla on otettu ”automaatilaskuri” - esimerkki ja muutettu se rekursion avulla sellaiseksi, että se toistaa toimintaansa niin kauan kunnes käyttäjä vastaa ”ei” kysymykseen ”Jatketaanko?”.

HUOM! Tämä on kurssin ulkopuolista lisämateriaalia, ei tarvita viikkotehtävässä.

Page 12: Racket MOOC viikko 5

12

Automaattilaskuri + rekursio

(require teachpacks/display-read)

;; pinta-ala : Luku Luku -> Merkkijono

(define (pinta-ala a b)

(if (and (number? a)(number? b))

(number->string (* a b))

"ei voi laskea"))

;; pinta-ala-laskuri : Luku -> Merkkijono

(define (pinta-ala-laskuri jatko) (if (string=? "ei" jatko)

(display-value "Kiitos, ja näkemiin" "")

(local [(define x (string->number (display-read "Anna kanta (cm)"))) (define y (string->number (display-read "Anna korkeus (cm)")))] (begin (display-value "Pinta-ala on (cm^2): " (pinta-ala x y)) (pinta-ala-laskuri (display-select "Jatketaanko?” (list "kyllä" "ei")))))))

(pinta-ala-laskuri "kyllä")

Huom!Tämä esimerkki vaatii ASL-kielen

local:in avulla voidaan tehdä funktion sisäisiä määrittelyjä (define)

begin:in avulla voidaan laittaa useampi lauseke peräkkäin, viimeisen lausekkeen arvo palautetaan

EXTRA MATERIAALIA

Funktio kutsuu itse itseään = rekursiivinen funktio = silmukka

lopetusehto

http://tinyurl.com/pgm5muy