public
Description: deepblue's thoughts
Homepage: http://myruby.net/
Clone URL: git://github.com/deepblue/snippets.git
Bryan Kang (author)
Sun Feb 08 18:55:02 -0800 2009
commit  50bcfcc83070f51559557fec8c20256fc72e781f
tree    fd5e69329803b69cb67cb4795a58ee36ec547764
parent  b188bf3aacdc917b1cbd03bedb35745d9992da71
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))
].