2010. 12. 3. 14:56
% module
-module(eulerPro2).
-export([piboSum/1]).
isEven(N) ->
even(N rem 2 =:= 0).
even(false) -> odd;
even(true) -> even.
piboSum(N) ->
piboSum({1,1},{0,N},odd).
piboSum({A,B},{Sum,N},odd) when A =< N ->
piboSum({B,A+B},{Sum,N},isEven(B));
piboSum({A,B},{Sum,N},even) when A =< N ->
piboSum({B,A+B},{Sum+A,N},isEven(B));
piboSum({A,_},{Sum,N},_) when A > N ->
Sum.
% test
-module(eulerPro2_tests).
-include_lib("eunit/include/eunit.hrl").
piboSum_test() ->
?assertEqual(0, eulerPro2:piboSum(1)),
?assertEqual(2, eulerPro2:piboSum(2)),
?assertEqual(2, eulerPro2:piboSum(5)),
?assertEqual(10, equerPro2:piboSum(8)).