Calculate Factorial in Java

Рассчитать факториал на 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.