Skip to content

Instantly share code, notes, and snippets.

@Joakineee
Last active May 14, 2020 10:25
Show Gist options
  • Save Joakineee/09611c9b5e58e13bfe98f25e2ae2fe2f to your computer and use it in GitHub Desktop.
Save Joakineee/09611c9b5e58e13bfe98f25e2ae2fe2f to your computer and use it in GitHub Desktop.
Tail recursive erlang
-module(trecursive).
-export([fib/1,perfect/1,test/0]).
fib(X) -> fib(X,0,1).
fib(0,Acc1,_) ->
Acc1;
fib(X,Acc1,Acc2) when X >= 1 ->
fib(X-1,Acc2,Acc1 + Acc2).
%Steep by steep:
%fib(4) -> fib(4,0,1).
%fib(4,0,1) -> fib(3,1,0 + 1).
%fib(3,1,1) -> fib(2,1,1 + 1).
%fib(2,1,2) -> fib(1,2,1 + 2).
%fib(1,2,3) -> fib(0,3,3 + 2).
%fib(0,3,5) -> 3.
perfect(X) -> perfect(X,1,0).
%Moddifeid according to brujoBenavides review:
%perfect(X,Divisor,Acc) when X == Divisor andalso X == Acc ->
perfect(X,X,X) ->
true;
%perfect(X,Divisor,_) when X == Divisor ->
perfect(X,X,_) ->
false;
perfect(X,Divisor,Acc) when X rem Divisor == 0 ->
perfect(X,Divisor +1 ,Acc + Divisor);
perfect(X,Divisor,Acc) ->
perfect(X,Divisor +1 ,Acc).
test() ->
3 = fib(4),
true = perfect(6),
true = perfect(28),
false = perfect(10),
success.
@elbrujohalcon
Copy link

Good job! One tip: You can use pattern-matching more aggressively…

perfect(X,X,X) -> 
	true;
perfect(X,X,_) -> 
	false;
…

@Joakineee
Copy link
Author

Yeah, thank you! I missed that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment