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ä.
Haskell-versio (muita osoitteessa http://www.haskell.org/haskellwiki/The_Fibonacci_sequence) Fibonacci-tehtävästä on näköjään äärimmäisen pelkistetty:
VastaaPoistafib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Jälleen kerran yksi hyvä syy lisää, miksi perehtyä kieleen. :)