From 2500ee06c70f3bb2cf4af80717b394082f7436de Mon Sep 17 00:00:00 2001 From: UTSAV SINGHAL <119779889+UTSAVS26@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:12:28 +0530 Subject: [PATCH 1/6] feature/CatalanNumbers --- .../thealgorithms/maths/CatalanNumbers.java | 48 +++++++++++++++++++ .../maths/CatalanNumbersTest.java | 36 ++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/com/thealgorithms/maths/CatalanNumbers.java create mode 100644 src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java diff --git a/src/main/java/com/thealgorithms/maths/CatalanNumbers.java b/src/main/java/com/thealgorithms/maths/CatalanNumbers.java new file mode 100644 index 000000000000..e7022583f2f6 --- /dev/null +++ b/src/main/java/com/thealgorithms/maths/CatalanNumbers.java @@ -0,0 +1,48 @@ +package com.thealgorithms.maths; + +/** + * Calculate Catalan Numbers + */ +public final class CatalanNumbers { + private CatalanNumbers() { + } + + /** + * Calculate the nth Catalan number using a recursive formula. + * + * @param n the index of the Catalan number to compute + * @return the nth Catalan number + */ + public static long catalan(final int n) { + if (n < 0) { + throw new IllegalArgumentException("Index must be non-negative"); + } + return factorial(2 * n) / (factorial(n + 1) * factorial(n)); + } + + /** + * Calculate the factorial of a number. + * + * @param n the number to compute the factorial for + * @return the factorial of n + */ + private static long factorial(final int n) { + if (n == 0 || n == 1) { + return 1; + } + long result = 1; + for (int i = 2; i <= n; i++) { + result *= i; + } + return result; + } + + /** + * Main method to test the Catalan number calculation. + */ + public static void main(String[] args) { + for (int i = 0; i <= 10; i++) { + System.out.println("Catalan number " + i + " is: " + catalan(i)); + } + } +} \ No newline at end of file diff --git a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java new file mode 100644 index 000000000000..cb80338f17f5 --- /dev/null +++ b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java @@ -0,0 +1,36 @@ +package com.thealgorithms.maths; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +/** + * Test class for CatalanNumbers + */ +class CatalanNumbersTest { + + @Test + void testCatalanNumbers() { + assertEquals(1, CatalanNumbers.catalan(0)); // C(0) = 1 + assertEquals(1, CatalanNumbers.catalan(1)); // C(1) = 1 + assertEquals(2, CatalanNumbers.catalan(2)); // C(2) = 2 + assertEquals(5, CatalanNumbers.catalan(3)); // C(3) = 5 + assertEquals(14, CatalanNumbers.catalan(4)); // C(4) = 14 + assertEquals(42, CatalanNumbers.catalan(5)); // C(5) = 42 + assertEquals(132, CatalanNumbers.catalan(6)); // C(6) = 132 + assertEquals(429, CatalanNumbers.catalan(7)); // C(7) = 429 + assertEquals(1430, CatalanNumbers.catalan(8)); // C(8) = 1430 + assertEquals(4862, CatalanNumbers.catalan(9)); // C(9) = 4862 + assertEquals(16796, CatalanNumbers.catalan(10)); // C(10) = 16796 + } + + @Test + void testIllegalInput() { + assertAll( + () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-1)), + () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-5)) + ); + } +} \ No newline at end of file From 7bebdb71e323df740dd2e05f651b99509a47317f Mon Sep 17 00:00:00 2001 From: UTSAV SINGHAL <119779889+UTSAVS26@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:18:44 +0530 Subject: [PATCH 2/6] Update CatalanNumbers.java --- .../java/com/thealgorithms/maths/CatalanNumbers.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/CatalanNumbers.java b/src/main/java/com/thealgorithms/maths/CatalanNumbers.java index e7022583f2f6..387756bdfa0c 100644 --- a/src/main/java/com/thealgorithms/maths/CatalanNumbers.java +++ b/src/main/java/com/thealgorithms/maths/CatalanNumbers.java @@ -36,13 +36,4 @@ private static long factorial(final int n) { } return result; } - - /** - * Main method to test the Catalan number calculation. - */ - public static void main(String[] args) { - for (int i = 0; i <= 10; i++) { - System.out.println("Catalan number " + i + " is: " + catalan(i)); - } - } -} \ No newline at end of file +} From 4f5ced55edcc8ffa83e823b1c4a5e8c32b6bbdba Mon Sep 17 00:00:00 2001 From: UTSAV SINGHAL <119779889+UTSAVS26@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:24:34 +0530 Subject: [PATCH 3/6] Update CatalanNumbersTest.java --- src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java index cb80338f17f5..30e19df4f7a0 100644 --- a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java +++ b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java @@ -33,4 +33,4 @@ void testIllegalInput() { () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-5)) ); } -} \ No newline at end of file +} From f36198d33f605f1b453d2d9ce4f9e8c655c766e7 Mon Sep 17 00:00:00 2001 From: UTSAV SINGHAL <119779889+UTSAVS26@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:43:57 +0530 Subject: [PATCH 4/6] Clang format linter / build (pull_request) resolved --- .../java/com/thealgorithms/maths/CatalanNumbersTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java index 30e19df4f7a0..75b458f69fc2 100644 --- a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java +++ b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java @@ -28,9 +28,6 @@ void testCatalanNumbers() { @Test void testIllegalInput() { - assertAll( - () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-1)), - () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-5)) - ); + assertAll(() -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-1)), () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-5))); } } From e609cae922137669ea9bc43e93531a43307acd56 Mon Sep 17 00:00:00 2001 From: UTSAV SINGHAL <119779889+UTSAVS26@users.noreply.github.com> Date: Wed, 16 Oct 2024 11:51:42 +0530 Subject: [PATCH 5/6] Update CatalanNumbersTest.java --- .../maths/CatalanNumbersTest.java | 53 +++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java index 75b458f69fc2..05740049d0bb 100644 --- a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java +++ b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java @@ -1,33 +1,56 @@ package com.thealgorithms.maths; -import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; /** * Test class for CatalanNumbers */ class CatalanNumbersTest { - @Test - void testCatalanNumbers() { - assertEquals(1, CatalanNumbers.catalan(0)); // C(0) = 1 - assertEquals(1, CatalanNumbers.catalan(1)); // C(1) = 1 - assertEquals(2, CatalanNumbers.catalan(2)); // C(2) = 2 - assertEquals(5, CatalanNumbers.catalan(3)); // C(3) = 5 - assertEquals(14, CatalanNumbers.catalan(4)); // C(4) = 14 - assertEquals(42, CatalanNumbers.catalan(5)); // C(5) = 42 - assertEquals(132, CatalanNumbers.catalan(6)); // C(6) = 132 - assertEquals(429, CatalanNumbers.catalan(7)); // C(7) = 429 - assertEquals(1430, CatalanNumbers.catalan(8)); // C(8) = 1430 - assertEquals(4862, CatalanNumbers.catalan(9)); // C(9) = 4862 - assertEquals(16796, CatalanNumbers.catalan(10)); // C(10) = 16796 + /** + * Provides test data for the parameterized Catalan number test. + * Each array contains two elements: + * [input number, expected Catalan number for that input] + */ + static Stream catalanNumbersProvider() { + return Stream.of( + new Object[]{0, 1}, + new Object[]{1, 1}, + new Object[]{2, 2}, + new Object[]{3, 5}, + new Object[]{4, 14}, + new Object[]{5, 42}, + new Object[]{6, 132}, + new Object[]{7, 429}, + new Object[]{8, 1430}, + new Object[]{9, 4862}, + new Object[]{10, 16796} + ); + } + + /** + * Parameterized test for checking the correctness of Catalan numbers. + * Uses the data from the provider method 'catalanNumbersProvider'. + */ + @ParameterizedTest + @MethodSource("catalanNumbersProvider") + void testCatalanNumbers(int input, int expected) { + assertEquals(expected, CatalanNumbers.catalan(input), + () -> String.format("Catalan number for input %d should be %d", input, expected)); } + /** + * Test for invalid inputs which should throw an IllegalArgumentException. + */ @Test void testIllegalInput() { - assertAll(() -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-1)), () -> assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-5))); + assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-1)); + assertThrows(IllegalArgumentException.class, () -> CatalanNumbers.catalan(-5)); } } From 4935ddb127bbeef9694387f447fb80a2a1d22bb6 Mon Sep 17 00:00:00 2001 From: UTSAV SINGHAL <119779889+UTSAVS26@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:04:26 +0530 Subject: [PATCH 6/6] Changes --- .../maths/CatalanNumbersTest.java | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java index 05740049d0bb..2248ffd93732 100644 --- a/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java +++ b/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java @@ -15,23 +15,11 @@ class CatalanNumbersTest { /** * Provides test data for the parameterized Catalan number test. - * Each array contains two elements: + * Each array contains two elements: * [input number, expected Catalan number for that input] */ static Stream catalanNumbersProvider() { - return Stream.of( - new Object[]{0, 1}, - new Object[]{1, 1}, - new Object[]{2, 2}, - new Object[]{3, 5}, - new Object[]{4, 14}, - new Object[]{5, 42}, - new Object[]{6, 132}, - new Object[]{7, 429}, - new Object[]{8, 1430}, - new Object[]{9, 4862}, - new Object[]{10, 16796} - ); + return Stream.of(new Object[] {0, 1}, new Object[] {1, 1}, new Object[] {2, 2}, new Object[] {3, 5}, new Object[] {4, 14}, new Object[] {5, 42}, new Object[] {6, 132}, new Object[] {7, 429}, new Object[] {8, 1430}, new Object[] {9, 4862}, new Object[] {10, 16796}); } /** @@ -41,8 +29,7 @@ static Stream catalanNumbersProvider() { @ParameterizedTest @MethodSource("catalanNumbersProvider") void testCatalanNumbers(int input, int expected) { - assertEquals(expected, CatalanNumbers.catalan(input), - () -> String.format("Catalan number for input %d should be %d", input, expected)); + assertEquals(expected, CatalanNumbers.catalan(input), () -> String.format("Catalan number for input %d should be %d", input, expected)); } /**