Рассчитать факториал на Java
1. обзор
Учитывая неотрицательное целое числоn, факториал - это произведение всех положительных целых чисел, меньших или равныхn.
В этом кратком руководстве мы рассмотримdifferent ways to calculate factorial for a given number in Java.
2. Факториал для номеров до 20
2.1. Факториал с использованием циклаfor
Давайте посмотрим на базовый факториальный алгоритм, использующий циклfor:
public long factorialUsingForLoop(int n) {
long fact = 1;
for (int i = 2; i <= n; i++) {
fact = fact * i;
}
return fact;
}
Вышеупомянутое решение будет работатьfine for numbers up to 20. Но если мы попробуем что-то большее, чем 20, то это не удастся, потому чтоresults would be too large to be fit into a long, вызывая переполнение.
Давайте посмотрим еще на несколько, отметив, что каждый изthese will only work for small numbers.
2.2. Факториал с использованием Java 8 Streams
Мы также можем использоватьJava 8 Stream API для довольно простого вычисления факториалов:
public long factorialUsingStreams(int n) {
return LongStream.rangeClosed(1, n)
.reduce(1, (long x, long y) -> x * y);
}
В этой программе мы сначала используемLongStream для перебора чисел от 1 доn. Затем мы использовалиreduce(), который использует значение идентичности и функцию накопителя для шага сокращения.
2.3. Факториал с использованием рекурсии
И давайте посмотрим на другой пример факториальной программы, на этот раз с использованием рекурсии:
public long factorialUsingRecursion(int n) {
if (n <= 2) {
return n;
}
return n * factorialUsingRecursion(n - 1);
}
2.4. Факториал с использованием Apache Commons Math
Apache Commons Math имеет классCombinatoricsUtils со статическим методомfactorial, который мы можем использовать для вычисления факториала.
Чтобы включить Apache Commons Math, мы добавимthe commons-math3 dependency в нашpom:
org.apache.commons
commons-math3
3.6.1
Давайте посмотрим на пример с использованием классаCombinatoricsUtils :
public long factorialUsingApacheCommons(int n) {
return CombinatoricsUtils.factorial(n);
}
Обратите внимание, что его тип возврата -long, как и в наших собственных решениях.
Это означает, что если вычисленное значение превышаетLong.MAX_VALUE, выдаетсяMathArithmeticException.
Чтобы получить больше,we are going to need a different return type.
3. Факториал для чисел больше 20
3.1. Факториал с использованиемBigInteger
Как обсуждалось ранее, тип данныхlong может использоваться для факториалов только дляn ⇐ 20.
Для больших значенийn,we can use the BigInteger class из пакетаjava.math, который может содержатьvalues up to 2^Integer.MAX_VALUE:
public BigInteger factorialHavingLargeResult(int n) {
BigInteger result = BigInteger.ONE;
for (int i = 2; i <= n; i++)
result = result.multiply(BigInteger.valueOf(i));
return result;
}
3.2. Факториал с использованием гуавы
Библиотека GoogleGuava также предоставляет служебный метод для вычисления факториалов для больших чисел.
Чтобы включить библиотеку, мы можем добавить ееthe guava dependency к нашемуpom:
com.google.guava
guava
25.1-jre
Теперь мы можем использовать статический методfactorial из классаBigIntegerMath для вычисления факториала заданного числа:
public BigInteger factorialUsingGuava(int n) {
return BigIntegerMath.factorial(n);
}
4. Заключение
В этой статье мы увидели несколько способов вычисления факториалов, используя ядро Java, а также несколько внешних библиотек.
Мы впервые увидели решения, использующие тип данныхlong для вычисления факториалов чисел до20. Затем мы увидели несколько способов использоватьBigInteger для чисел больше 20.
Код, представленный в этой статье, доступенover on Github.