-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrecursion2.erl
52 lines (42 loc) · 1.13 KB
/
recursion2.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-module(recursion2).
-export([fib/1, fib/3, fib_tests/0, perfect_tests/0, perfect/1]).
% An efficient implementation of fibonacci
fib(N) -> fib(N, 0, 1).
fib(0, Prev, _) -> Prev;
fib(Cnt, Prev, Curr) -> fib(Cnt-1, Curr, Prev+Curr).
% fib(4)
% fib(4,0,1)
% fib(3,1,1)
% fib(2,1,2)
% fib(1,2,3)
% fib(0,3,5)
% 5
fib_tests() ->
0 = fib(0),
1 = fib(1),
1 = fib(2),
2 = fib(3),
3 = fib(4),
5 = fib(5),
8 = fib(6),
fib_tests_passed.
% A positive integer is perfect when it is the sum of its divisors,
% e.g. 6=1+2+3, 28=1+2+4+7+14.
%
% Take a positive number N and returns a boolean which indicates whether
% or not the number is perfect.
perfect_tests() ->
true = perfect(6),
true = perfect(28),
true = perfect(496),
true = perfect(8128),
false = perfect(1),
false = perfect(2),
false = perfect(3),
false = perfect(4),
false = perfect(5),
perfect_tests_passed.
perfect(N) -> perfect(N, N-1, 0).
perfect(N, 0, Acc) -> N == Acc;
perfect(N, Cnt, Acc) when (N rem Cnt) > 0 -> perfect(N, Cnt-1, Acc);
perfect(N, Cnt, Acc) when (N rem Cnt) == 0 -> perfect(N, Cnt-1, Acc + Cnt).