Skip to content

Commit a370f6e

Browse files
dhananjay12KevinGilmore
authored andcommitted
Calculate Factorial in Java (eugenp#5748)
* Factorials * Refactored factorials * Change input to int * Small fixes * Renamed tests
1 parent 57d6c39 commit a370f6e

3 files changed

Lines changed: 141 additions & 0 deletions

File tree

algorithms-miscellaneous-1/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
<artifactId>commons-math3</artifactId>
1818
<version>${commons-math3.version}</version>
1919
</dependency>
20+
<dependency>
21+
<groupId>com.google.guava</groupId>
22+
<artifactId>guava</artifactId>
23+
<version>${guava.version}</version>
24+
</dependency>
2025
<dependency>
2126
<groupId>commons-codec</groupId>
2227
<artifactId>commons-codec</artifactId>
@@ -73,6 +78,7 @@
7378
<commons-math3.version>3.6.1</commons-math3.version>
7479
<org.assertj.core.version>3.9.0</org.assertj.core.version>
7580
<commons-codec.version>1.11</commons-codec.version>
81+
<guava.version>25.1-jre</guava.version>
7682
</properties>
7783

7884
</project>
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.baeldung.algorithms.factorial;
2+
3+
import java.math.BigInteger;
4+
import java.util.stream.LongStream;
5+
6+
import org.apache.commons.math3.util.CombinatoricsUtils;
7+
8+
import com.google.common.math.BigIntegerMath;
9+
10+
public class Factorial {
11+
12+
public long factorialUsingForLoop(int n) {
13+
long fact = 1;
14+
for (int i = 2; i <= n; i++) {
15+
fact = fact * i;
16+
}
17+
return fact;
18+
}
19+
20+
public long factorialUsingStreams(int n) {
21+
return LongStream.rangeClosed(1, n)
22+
.reduce(1, (long x, long y) -> x * y);
23+
}
24+
25+
public long factorialUsingRecursion(int n) {
26+
if (n <= 2) {
27+
return n;
28+
}
29+
return n * factorialUsingRecursion(n - 1);
30+
}
31+
32+
private Long[] factorials = new Long[20];
33+
34+
public long factorialUsingMemoize(int n) {
35+
36+
if (factorials[n] != null) {
37+
return factorials[n];
38+
}
39+
40+
if (n <= 2) {
41+
return n;
42+
}
43+
long nthValue = n * factorialUsingMemoize(n - 1);
44+
factorials[n] = nthValue;
45+
return nthValue;
46+
}
47+
48+
public BigInteger factorialHavingLargeResult(int n) {
49+
BigInteger result = BigInteger.ONE;
50+
for (int i = 2; i <= n; i++)
51+
result = result.multiply(BigInteger.valueOf(i));
52+
return result;
53+
}
54+
55+
public long factorialUsingApacheCommons(int n) {
56+
return CombinatoricsUtils.factorial(n);
57+
}
58+
59+
public BigInteger factorialUsingGuava(int n) {
60+
return BigIntegerMath.factorial(n);
61+
}
62+
63+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.baeldung.algorithms.factorial;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.math.BigInteger;
6+
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
10+
public class FactorialUnitTest {
11+
12+
Factorial factorial;
13+
14+
@Before
15+
public void setup() {
16+
factorial = new Factorial();
17+
}
18+
19+
@Test
20+
public void whenCalculatingFactorialUsingForLoop_thenCorrect() {
21+
int n = 5;
22+
23+
assertThat(factorial.factorialUsingForLoop(n)).isEqualTo(120);
24+
}
25+
26+
@Test
27+
public void whenCalculatingFactorialUsingStreams_thenCorrect() {
28+
int n = 5;
29+
30+
assertThat(factorial.factorialUsingStreams(n)).isEqualTo(120);
31+
}
32+
33+
@Test
34+
public void whenCalculatingFactorialUsingRecursion_thenCorrect() {
35+
int n = 5;
36+
37+
assertThat(factorial.factorialUsingRecursion(n)).isEqualTo(120);
38+
}
39+
40+
@Test
41+
public void whenCalculatingFactorialUsingMemoize_thenCorrect() {
42+
int n = 5;
43+
44+
assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(120);
45+
46+
n = 6;
47+
48+
assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(720);
49+
}
50+
51+
@Test
52+
public void whenCalculatingFactorialHavingLargeResult_thenCorrect() {
53+
int n = 22;
54+
55+
assertThat(factorial.factorialHavingLargeResult(n)).isEqualTo(new BigInteger("1124000727777607680000"));
56+
}
57+
58+
@Test
59+
public void whenCalculatingFactorialUsingApacheCommons_thenCorrect() {
60+
int n = 5;
61+
62+
assertThat(factorial.factorialUsingApacheCommons(n)).isEqualTo(120);
63+
}
64+
65+
@Test
66+
public void whenCalculatingFactorialUsingGuava_thenCorrect() {
67+
int n = 22;
68+
69+
assertThat(factorial.factorialUsingGuava(n)).isEqualTo(new BigInteger("1124000727777607680000"));
70+
}
71+
72+
}

0 commit comments

Comments
 (0)