Created
June 27, 2017 10:09
-
-
Save Ceroce/be3d5f4f04fc4ce42d1ff8519435421c to your computer and use it in GitHub Desktop.
Erlang: Fibonacci with Tail recursion + determining if an integer is perfect.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-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