複利計算、再び

30分プログラム、その678。昔やった複利計算 - みずぴー日記をリメイクしてみました。

再帰をやめて、scanlを使っているあたりに成長を感じていただければ幸いです。あ、でもうまくファイル入力ができなかったです。ダメダメですね。

使い方

1> compound:each_line("20:100:5").
100
105
110
115
120
126
132
138
144
151
158
165
173
181
190
199
208
218
228
239
ok

ソースコード

-module(compound).
-compile([export_all]).

parse(S)->
    Count = string:sub_word(S, 1, $:),
    Init  = string:sub_word(S, 2, $:),
    Per   = string:sub_word(S, 3, $:),
    {ok,list_to_integer(Count), list_to_integer(Init), list_to_integer(Per) / 100.0}.


scanl(_, X, []) ->
     [X];
scanl(F, X, [H|Tl]) ->
    [X| scanl(F,F(X,H) ,Tl)].

calc(Count,Init, Per) ->
    scanl(fun(X,Y)-> round(X * Y-0.5) end,Init,lists:duplicate(Count - 1, 1 + Per)).

each_line(L) ->
    {ok, Count,Init, Per} = parse(L),
    lists:foreach(fun(S)-> io:format("~p~n",[S]) end,calc(Count,Init, Per)).