Korkokertymiä
Jos voittaisi lotossa yhden miljoonan, miten hyvin sillä eläisi perushyvää elämää? Lyhyt vertailu Pythonin ja Clojuren välisistä ratkaisumalleista.
Alkuoletukset
Voitto on tasan miljoonan. Sopivilla rahastosijoituksilla tekee annetulle sijoitukselle kahden prosentin vuosituoton (aika vähän, koska inflaatio luultavasti jatkuu tulevaisuudessakin melko korkealla).
Perushyvää elämää on aika maltillinen 2500 euroa kuukaudessa. Nettona tuota tehdessä ainakin minä jäisin jo työelämästä pois.
Ja viimeisenä on hyvä huomata, että tämä laskentamalli on epätarkka. Koko vuoden menoja ei yleensä varata vuoden alussa, vaan niitä syntyy hiljalleen. Tästä syystä vuosia kertyy enemmän.
Pythonilla
Pythonin ollessa imperatiivinen kieli, lähdin sillä huvikseni laskemaan konkreettisia lukuja.
In [2]: vuosituotto = 1.02 In [38]: V = 1e6 In [39]: vuosia = 0 In [40]: while V > 0: ....: V = V - (2500*12) ; V = V * vuosituotto ....: vuosia += 1 ....: In [41]: vuosia Out[41]: 54
Semmoisen numeron sylkäisi ulos. Koska monirivisten lohkojen käsittely sisennyssääntöjen takia on tympeätä Python-kuorissa (IPython käytössä kuitenkin), siirryin kielten kieleen seuraavaksi.
Clojurella
Tietysti osittain omaa tottumista ja muita seurauksia syyttäen tämä
tulos on huomattavasti dataorienteisempi oitis. Funktionaalinen
funktio +year
ottaa alkupääoman ja palauttaa vuoden lopussa
tilin uuden saldon.
user=> (def V 1e6) #'user/V user=> (def interest 1.02) #'user/interest user=> (def monthly 2500) #'user/monthly user=> (defn +year [v] (* (- v (* 12 monthly)) interest)) #'user/+year user=> (+year V) 989400.0 user=> (take-while pos? (iterate +year V)) (1000000.0 989400.0 978588.0 ...snip... 45826.06171246591 16142.582946715229) user=> (count *1) 54