From eb7cc477ff5bb65ae1915f6e4e6ac852b86b0859 Mon Sep 17 00:00:00 2001 From: Koushik Sai Date: Fri, 19 Dec 2025 11:40:25 +0530 Subject: [PATCH 1/2] 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/2] [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)); } }