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