public
Description: deepblue's thoughts
Homepage: http://myruby.net/
Clone URL: git://github.com/deepblue/snippets.git
snippets / chalenge / collatz / collatz.erl
100644 43 lines (28 sloc) 0.95 kb
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
-module (collatz).
-export ([collatz/1]).
-include_lib("eunit/include/eunit.hrl").
 
next_number(X) when X rem 2 == 0 -> X div 2;
next_number(X) -> X*3+1.
 
collatz(N) when is_integer(N) -> collatz([N]);
collatz([]) -> [];
collatz([H|L]) when H == 1 -> lists:reverse([H|L]);
collatz([H|L]) -> collatz([next_number(H)] ++ [H|L]).
 
collatz_length(N) -> length(collatz(N)).
 
max_length(From, To) ->
  lists:max([collatz_length(X) || X <- lists:seq(From, To)]).
 
 
 
 
 
 
next_number_test_() -> [
  ?_assert(2 == next_number(4)),
  ?_assert(16 == next_number(5))
].
 
collatz_test_() -> [
  ?_assert([2,1] == collatz([1,2])),
  ?_assert([1] == collatz(1)),
  
  ?_assert([2, 1] == collatz(2)),
  ?_assert([22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] == collatz(22)),
 
  ?_assert(16 == collatz_length(22))  
].
 
max_length_test_() -> [
  ?_assert(20 == max_length(1,10)),
  ?_assert(125 == max_length(100,200)),
  ?_assert(174 == max_length(900,1000))
].