From 8ca571d8870b20f1a15ca355bf612385291b9c5c Mon Sep 17 00:00:00 2001
From: Amarildo Aliaj <82412439+amarildoaliaj@users.noreply.github.com>
Date: Mon, 26 Sep 2022 06:51:21 +0200
Subject: [PATCH] Add Collatz Conjecture (#3290)
---
.../maths/CollatzConjecture.java | 42 +++++++++++++++++++
.../maths/CollatzConjectureTest.java | 40 ++++++++++++++++++
2 files changed, 82 insertions(+)
create mode 100644 src/main/java/com/thealgorithms/maths/CollatzConjecture.java
create mode 100644 src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java
diff --git a/src/main/java/com/thealgorithms/maths/CollatzConjecture.java b/src/main/java/com/thealgorithms/maths/CollatzConjecture.java
new file mode 100644
index 000000000..980dc89b7
--- /dev/null
+++ b/src/main/java/com/thealgorithms/maths/CollatzConjecture.java
@@ -0,0 +1,42 @@
+package com.thealgorithms.maths;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ...
+ */
+public class CollatzConjecture {
+
+ /**
+ * Calculate the next number of the sequence.
+ *
+ * @param n current number of the sequence
+ * @return next number of the sequence
+ */
+ public int nextNumber(final int n) {
+ if (n % 2 == 0) {
+ return n / 2;
+ }
+ return 3 * n + 1;
+ }
+
+ /**
+ * Calculate the Collatz sequence of any natural number.
+ *
+ * @param firstNumber starting number of the sequence
+ * @return sequence of the Collatz Conjecture
+ */
+ public List collatzConjecture(int firstNumber) {
+ if (firstNumber < 1) {
+ throw new IllegalArgumentException("Must be a natural number");
+ }
+ ArrayList result = new ArrayList<>();
+ result.add(firstNumber);
+ while (firstNumber != 1) {
+ result.add(nextNumber(firstNumber));
+ firstNumber = nextNumber(firstNumber);
+ }
+ return result;
+ }
+}
diff --git a/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java b/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java
new file mode 100644
index 000000000..e63a956dc
--- /dev/null
+++ b/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java
@@ -0,0 +1,40 @@
+package com.thealgorithms.maths;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class CollatzConjectureTest {
+
+ static CollatzConjecture cConjecture;
+
+ @BeforeAll
+ static void setUp() {
+ cConjecture = new CollatzConjecture();
+ }
+
+ @Test
+ void nextNumberFromEvenNumber() {
+ assertEquals(25, cConjecture.nextNumber(50));
+ }
+
+ @Test
+ void nextNumberFromOddNumber() {
+ assertEquals(154, cConjecture.nextNumber(51));
+ }
+
+ @Test
+ void collatzConjecture() {
+ final List expected = List.of(35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1);
+ assertIterableEquals(expected, cConjecture.collatzConjecture(35));
+ }
+
+ @Test
+ void sequenceOfNotNaturalFirstNumber() {
+ assertThrows(IllegalArgumentException.class, () -> cConjecture.collatzConjecture(0));
+ assertThrows(IllegalArgumentException.class, () -> cConjecture.collatzConjecture(-1));
+ }
+}
\ No newline at end of file