-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFactorial.java
More file actions
30 lines (25 loc) · 934 Bytes
/
Copy pathFactorial.java
File metadata and controls
30 lines (25 loc) · 934 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package recursion;
import java.math.BigInteger;
public class Factorial {
public static TailCall<BigInteger> factorialTailRec(final BigInteger factorial, final int number) {
if (number == 0 || number == 1)
return TailCalls.done(factorial);
else
return TailCalls.call(() -> factorialTailRec(factorial.multiply(BigInteger.valueOf(number)), number - 1));
}
public static BigInteger factorial(int number) {
return factorialTailRec(BigInteger.ONE, number).invoke();
}
// recursive version without tail-call optimization safety
public static BigInteger factorialRecursive(int number) {
if (number == 1)
return BigInteger.ONE;
else
return BigInteger.valueOf(number).multiply(factorialRecursive(number - 1));
}
public static void main() {
System.out.println(
factorial(1000)
);
}
}