From eb7cc477ff5bb65ae1915f6e4e6ac852b86b0859 Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Fri, 19 Dec 2025 11:40:25 +0530 Subject: [PATCH 1/6] Add recursive factorial implementation with tests --- .../recursion/FactorialRecursion.java | 37 +++++++++++++++++++ .../recursion/FactorialRecursionTest.java | 34 +++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/java/com/thealgorithms/recursion/FactorialRecursion.java create mode 100644 src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java diff --git a/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java b/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java new file mode 100644 index 000000000000..ac7306da40a1 --- /dev/null +++ b/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java @@ -0,0 +1,37 @@ +package com.thealgorithms.recursion; + +/* + * Factorial of a number n is the product of all positive integers less than + * or equal to n. + * + * n! = n × (n - 1) × (n - 2) × ... × 1 + * + * Examples: + * 0! = 1 + * 1! = 1 + * 5! = 120 + */ + +public final class FactorialRecursion { + + private FactorialRecursion() { + throw new UnsupportedOperationException("Utility class"); + } + + /** + * Computes the factorial of a non-negative integer using recursion. + * + * @param n the number whose factorial is to be computed + * @return factorial of n + * @throws IllegalArgumentException if n is negative + */ + public static long factorial(int n) { + if (n < 0) { + throw new IllegalArgumentException("Factorial is not defined for negative numbers"); + } + if (n <= 1) { + return 1; + } + return n * factorial(n - 1); + } +} diff --git a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java new file mode 100644 index 000000000000..6c6f75683d33 --- /dev/null +++ b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java @@ -0,0 +1,34 @@ +package com.thealgorithms.recursion; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Test; + +class FactorialRecursionTest { + + @Test + void testFactorialOfZero() { + assertEquals(1, FactorialRecursion.factorial(0)); + } + + @Test + void testFactorialOfOne() { + assertEquals(1, FactorialRecursion.factorial(1)); + } + + @Test + void testFactorialOfPositiveNumber() { + assertEquals(120, FactorialRecursion.factorial(5)); + } + + @Test + void testFactorialOfLargerNumber() { + assertEquals(3628800, FactorialRecursion.factorial(10)); + } + + @Test + void testFactorialOfNegativeNumber() { + assertThrows(IllegalArgumentException.class, + () -> FactorialRecursion.factorial(-1)); + } +} From 6bbabd827b0ec2bd485c0bddb1bc00c179c57704 Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Fri, 19 Dec 2025 12:05:46 +0530 Subject: [PATCH 2/6] [STYLE] Apply clang-format --- .../com/thealgorithms/recursion/FactorialRecursionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java index 6c6f75683d33..2342a5c565a4 100644 --- a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java +++ b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; + import org.junit.jupiter.api.Test; class FactorialRecursionTest { @@ -28,7 +29,6 @@ void testFactorialOfLargerNumber() { @Test void testFactorialOfNegativeNumber() { - assertThrows(IllegalArgumentException.class, - () -> FactorialRecursion.factorial(-1)); + assertThrows(IllegalArgumentException.class, () -> FactorialRecursion.factorial(-1)); } } From ccf2de03c1ec14d43430584fed27738ddb5c8cd0 Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Mon, 22 Dec 2025 11:44:09 +0530 Subject: [PATCH 3/6] Move recursive factorial to recursion package and remove duplicate --- .../maths/FactorialRecursion.java | 18 ---------- .../recursion/FactorialRecursion.java | 29 +++------------- .../maths/FactorialRecursionTest.java | 27 --------------- .../recursion/FactorialRecursionTest.java | 33 ++++++++----------- 4 files changed, 19 insertions(+), 88 deletions(-) delete mode 100644 src/main/java/com/thealgorithms/maths/FactorialRecursion.java delete mode 100644 src/test/java/com/thealgorithms/maths/FactorialRecursionTest.java diff --git a/src/main/java/com/thealgorithms/maths/FactorialRecursion.java b/src/main/java/com/thealgorithms/maths/FactorialRecursion.java deleted file mode 100644 index d9bafd1e39e9..000000000000 --- a/src/main/java/com/thealgorithms/maths/FactorialRecursion.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.thealgorithms.maths; - -public final class FactorialRecursion { - private FactorialRecursion() { - } - /** - * Recursive FactorialRecursion Method - * - * @param n The number to factorial - * @return The factorial of the number - */ - public static long factorial(int n) { - if (n < 0) { - throw new IllegalArgumentException("number is negative"); - } - return n == 0 || n == 1 ? 1 : n * factorial(n - 1); - } -} diff --git a/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java b/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java index ac7306da40a1..673f216bdc9a 100644 --- a/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java +++ b/src/main/java/com/thealgorithms/recursion/FactorialRecursion.java @@ -1,37 +1,18 @@ package com.thealgorithms.recursion; -/* - * Factorial of a number n is the product of all positive integers less than - * or equal to n. - * - * n! = n × (n - 1) × (n - 2) × ... × 1 - * - * Examples: - * 0! = 1 - * 1! = 1 - * 5! = 120 - */ - public final class FactorialRecursion { - private FactorialRecursion() { - throw new UnsupportedOperationException("Utility class"); } - /** - * Computes the factorial of a non-negative integer using recursion. + * Recursive FactorialRecursion Method * - * @param n the number whose factorial is to be computed - * @return factorial of n - * @throws IllegalArgumentException if n is negative + * @param n The number to factorial + * @return The factorial of the number */ public static long factorial(int n) { if (n < 0) { - throw new IllegalArgumentException("Factorial is not defined for negative numbers"); - } - if (n <= 1) { - return 1; + throw new IllegalArgumentException("number is negative"); } - return n * factorial(n - 1); + return n == 0 || n == 1 ? 1 : n * factorial(n - 1); } } diff --git a/src/test/java/com/thealgorithms/maths/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/maths/FactorialRecursionTest.java deleted file mode 100644 index db18b46356b4..000000000000 --- a/src/test/java/com/thealgorithms/maths/FactorialRecursionTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.thealgorithms.maths; - -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.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -public class FactorialRecursionTest { - @ParameterizedTest - @MethodSource("inputStream") - void testFactorialRecursion(long expected, int number) { - assertEquals(expected, FactorialRecursion.factorial(number)); - } - - private static Stream inputStream() { - return Stream.of(Arguments.of(1, 0), Arguments.of(1, 1), Arguments.of(2, 2), Arguments.of(6, 3), Arguments.of(120, 5)); - } - - @Test - void testThrowsForNegativeInput() { - assertThrows(IllegalArgumentException.class, () -> FactorialRecursion.factorial(-1)); - } -} diff --git a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java index 2342a5c565a4..95e66a5e1dbd 100644 --- a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java +++ b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java @@ -1,34 +1,29 @@ package com.thealgorithms.recursion; +import java.util.stream.Stream; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; - import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -class FactorialRecursionTest { - - @Test - void testFactorialOfZero() { - assertEquals(1, FactorialRecursion.factorial(0)); - } - - @Test - void testFactorialOfOne() { - assertEquals(1, FactorialRecursion.factorial(1)); - } +import com.thealgorithms.recursion.FactorialRecursion; - @Test - void testFactorialOfPositiveNumber() { - assertEquals(120, FactorialRecursion.factorial(5)); +public class FactorialRecursionTest { + @ParameterizedTest + @MethodSource("inputStream") + void testFactorialRecursion(long expected, int number) { + assertEquals(expected, FactorialRecursion.factorial(number)); } - @Test - void testFactorialOfLargerNumber() { - assertEquals(3628800, FactorialRecursion.factorial(10)); + private static Stream inputStream() { + return Stream.of(Arguments.of(1, 0), Arguments.of(1, 1), Arguments.of(2, 2), Arguments.of(6, 3), Arguments.of(120, 5)); } @Test - void testFactorialOfNegativeNumber() { + void testThrowsForNegativeInput() { assertThrows(IllegalArgumentException.class, () -> FactorialRecursion.factorial(-1)); } } From dde4d4a323e0ae4f7a576653bc9513381b0fe924 Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Mon, 22 Dec 2025 11:47:16 +0530 Subject: [PATCH 4/6] Move recursive factorial to recursion package and remove duplicate --- .../java/com/thealgorithms/recursion/FactorialRecursionTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java index 95e66a5e1dbd..f57ab7ad29e4 100644 --- a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java +++ b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java @@ -9,7 +9,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import com.thealgorithms.recursion.FactorialRecursion; public class FactorialRecursionTest { @ParameterizedTest From acd4cc19f4269fcf2630d5136188500bf193b031 Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Mon, 22 Dec 2025 11:52:16 +0530 Subject: [PATCH 5/6] Apply clang-format to factorial recursion tests --- .../java/com/thealgorithms/recursion/FactorialRecursionTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java index f57ab7ad29e4..f14e1d7bd763 100644 --- a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java +++ b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java @@ -9,7 +9,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; - public class FactorialRecursionTest { @ParameterizedTest @MethodSource("inputStream") From 0bc3398826b09ee035aa028f11700c008e9d9dea Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Mon, 22 Dec 2025 11:54:03 +0530 Subject: [PATCH 6/6] Apply clang-format to factorial recursion tests --- .../com/thealgorithms/recursion/FactorialRecursionTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java index f14e1d7bd763..198fcd558f63 100644 --- a/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java +++ b/src/test/java/com/thealgorithms/recursion/FactorialRecursionTest.java @@ -1,9 +1,9 @@ package com.thealgorithms.recursion; -import java.util.stream.Stream; - 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.Arguments;