perjantai 27. helmikuuta 2009

Demo 6 - kommentit

Kuudennen ja tähän asti vähiten suositun (hiihtolomaviikko :) ) demokerran tehtävät löytyvät osoitteesta http://users.jyu.fi/~antkaij/opetus/okp/2009/demot/6.html . Tällä kertaa tein sekä ensimmäisen ja toisen tehtävän. Toisen tehtävän c-kohtaa "Funktio, joka luo parametrina annetun pituisen Fibonacci-lukujen listan (NumList)." lähdin ratkaisemaan turhan geneerisesti. Ajatuksena oli, että fibonaccin lukujen listaa ajateltaisiin generaattorina ja n-mittainen lista koostettaisiin toisen aliohjelman avulla, jolle annettaisiin syötteenä n:n lisäksi generaattorialiohjelma. Pythonilla ratkaisu menisi seuraavasti:


def fibo():
n, m = 0, 1

while True:
yield n
n, m = m, n + m

def list_factory(n, gen):
return [gen.next() for i in range(n)]

assert list_factory(10, fibo()) == [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]


Tuo varmaan kääntyy myös lambda-lausekkeiksi pienellä vaivalla. Yllä oleva ratkaisu toimii tässä tapauksessa. Kuitenkin yleisemmässä käytössä generaattori varmaan muuttuisi omaksi luokakseen, jonka voisi nollata. Toisaalta fibo generaattoria voisi ajatella myös aliohjelmana, joka laskee n:n arvon tilastaan riippumatta. Isoilla n:n arvoilla aliohjelmapohjaisen ratkaisun suorituskyky saattaisi tosin kärsiä.

1 kommentti:

  1. Haskell-versio (muita osoitteessa http://www.haskell.org/haskellwiki/The_Fibonacci_sequence) Fibonacci-tehtävästä on näköjään äärimmäisen pelkistetty:
    fib 0 = 0
    fib 1 = 1
    fib n = fib (n-1) + fib (n-2)

    Jälleen kerran yksi hyvä syy lisää, miksi perehtyä kieleen. :)

    VastaaPoista