Skip to content

Commit 8ca571d

Browse files
authored
Add Collatz Conjecture (TheAlgorithms#3290)
1 parent 2847953 commit 8ca571d

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.thealgorithms.maths;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* <a href="https://en.wikipedia.org/wiki/Collatz_conjecture">...</a>
8+
*/
9+
public class CollatzConjecture {
10+
11+
/**
12+
* Calculate the next number of the sequence.
13+
*
14+
* @param n current number of the sequence
15+
* @return next number of the sequence
16+
*/
17+
public int nextNumber(final int n) {
18+
if (n % 2 == 0) {
19+
return n / 2;
20+
}
21+
return 3 * n + 1;
22+
}
23+
24+
/**
25+
* Calculate the Collatz sequence of any natural number.
26+
*
27+
* @param firstNumber starting number of the sequence
28+
* @return sequence of the Collatz Conjecture
29+
*/
30+
public List<Integer> collatzConjecture(int firstNumber) {
31+
if (firstNumber < 1) {
32+
throw new IllegalArgumentException("Must be a natural number");
33+
}
34+
ArrayList<Integer> result = new ArrayList<>();
35+
result.add(firstNumber);
36+
while (firstNumber != 1) {
37+
result.add(nextNumber(firstNumber));
38+
firstNumber = nextNumber(firstNumber);
39+
}
40+
return result;
41+
}
42+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.thealgorithms.maths;
2+
3+
import org.junit.jupiter.api.BeforeAll;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.List;
7+
8+
import static org.junit.jupiter.api.Assertions.*;
9+
10+
class CollatzConjectureTest {
11+
12+
static CollatzConjecture cConjecture;
13+
14+
@BeforeAll
15+
static void setUp() {
16+
cConjecture = new CollatzConjecture();
17+
}
18+
19+
@Test
20+
void nextNumberFromEvenNumber() {
21+
assertEquals(25, cConjecture.nextNumber(50));
22+
}
23+
24+
@Test
25+
void nextNumberFromOddNumber() {
26+
assertEquals(154, cConjecture.nextNumber(51));
27+
}
28+
29+
@Test
30+
void collatzConjecture() {
31+
final List<Integer> expected = List.of(35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1);
32+
assertIterableEquals(expected, cConjecture.collatzConjecture(35));
33+
}
34+
35+
@Test
36+
void sequenceOfNotNaturalFirstNumber() {
37+
assertThrows(IllegalArgumentException.class, () -> cConjecture.collatzConjecture(0));
38+
assertThrows(IllegalArgumentException.class, () -> cConjecture.collatzConjecture(-1));
39+
}
40+
}

0 commit comments

Comments
 (0)