複利計算、再び
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)).