Skip to content

Instantly share code, notes, and snippets.

@peerreynders
Created February 22, 2017 02:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save peerreynders/eddf52bb811e5c01684413cbb4925c21 to your computer and use it in GitHub Desktop.
Save peerreynders/eddf52bb811e5c01684413cbb4925c21 to your computer and use it in GitHub Desktop.
Functional Programming in Erlang: 1.21 Tail recursion
-module(tail).
-export([fib/1, perfect/1]).
% Functional Programming in Erlang
% 1.21 Tail recursion
fib(0) -> 0;
fib(N) when N > 0 -> fib(N,0,1).
% fib(N,0,1) i.e."0,1"
% beginning of "0,1,1,2,3,5,..."
fib(0, BeforeLast, _) -> BeforeLast;
fib(1, _, Last) -> Last;
fib(N, BeforeLast, Last) ->
fib(N-1, Last, BeforeLast+Last).
perfect(Num) when Num < 2 -> false;
perfect(Num) when is_integer(Num) ->
Num == sum_divisors(1,2, trunc(math:sqrt(Num)), Num).
part_sum(Divisor, Num) ->
Quotient = Num div Divisor,
if Quotient == Divisor ->
Divisor;
true ->
Quotient + Divisor
end.
sum_divisors(Sum, I, Limit, _Num) when I > Limit -> Sum;
sum_divisors(Sum, I, Limit, Num) when (Num rem I) == 0 ->
sum_divisors(Sum + part_sum(I, Num), I + 1, Limit, Num);
sum_divisors(Sum, I, Limit, Num) ->
sum_divisors(Sum, I + 1, Limit, Num).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment