Skip to content

Instantly share code, notes, and snippets.

@Ceroce
Created June 27, 2017 10:09
Show Gist options
  • Save Ceroce/be3d5f4f04fc4ce42d1ff8519435421c to your computer and use it in GitHub Desktop.
Save Ceroce/be3d5f4f04fc4ce42d1ff8519435421c to your computer and use it in GitHub Desktop.
Erlang: Fibonacci with Tail recursion + determining if an integer is perfect.
-module(recursion).
-export([fib/1, fibtail/1, fibtail/3, isPerfect/1]).
fib(0) ->
0;
fib(1) ->
1;
fib(N) when N > 0 ->
fib(N-1)+fib(N-2).
% Fibonacci with tail recursion
% C = decounter (1-N). C == 0 is the stop condition
% Acc1 = accumulator for N-1
% Acc2 = accumulator for N-2
fibtail(N) ->
fibtail(N, 0, 1).
fibtail(0, Acc1, _) ->
Acc1;
fibtail(C, Acc1, Acc2) ->
fibtail(C-1, Acc1+Acc2, Acc1).
% A number is perfect when it is the sum of its divisors
isPerfect(N) ->
isPerfect(0, 1, N).
isPerfect(Sum, _, N) when Sum == N ->
true;
isPerfect(Sum, _, N) when Sum > N ->
false;
isPerfect(Sum, Div, N) ->
isPerfect(Sum + Div, nextDivisor(Div, N), N).
nextDivisor(Div, N) when N rem (Div+1) == 0 ->
Div + 1;
nextDivisor(Div, N) when Div < N ->
nextDivisor(Div + 1, N);
nextDivisor(Div, N) ->
Div.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment