Вычислить факториал в Java

1. Обзор

Учитывая неотрицательное целое число n , факториал - это произведение всех положительных целых чисел, меньших или равных n .

В этом кратком руководстве мы рассмотрим различные способы вычисления факториала для заданного числа в 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; }

Вышеупомянутое решение будет работать с числами до 20 . Но если мы попробуем что-то большее, чем 20, то это не удастся, потому что результаты будут слишком большими, чтобы уместиться в длинном , вызывая переполнение.

Давайте посмотрим еще несколько, отметив, что каждый из них будет работать только для небольших чисел.

2.2. Факториал с использованием потоков Java 8

Мы также можем использовать 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 со статическим методом факториала, который мы можем использовать для вычисления факториала.

Чтобы включить Apache Commons Math, мы добавим зависимость commons-math3 в наш pom :

 org.apache.commons commons-math3 3.6.1 

Давайте посмотрим на пример с использованием класса CombinatoricsUtils :

public long factorialUsingApacheCommons(int n) { return CombinatoricsUtils.factorial(n); }

Обратите внимание, что его возвращаемый тип длинный , как и в наших собственных решениях.

Это означает, что если вычисленное значение превышает Long.MAX_VALUE , генерируется исключение MathArithmeticException .

Чтобы получить больше, нам понадобится другой тип возвращаемого значения.

3. Факториал для чисел больше 20

3.1. Факториал с использованием BigInteger

Как обсуждалось ранее, длинный тип данных может использоваться для факториалов только для n <= 20 .

Для больших значений п , мы можем использовать BigInteger класс от java.math пакета, который может содержать значения до 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. Факториал с использованием гуавы

Библиотека Google Guava также предоставляет служебный метод для вычисления факториалов для больших чисел.

Чтобы включить библиотеку, мы можем добавить ее зависимость guava в наш pom :

 com.google.guava guava 25.1-jre 

Теперь мы можем использовать статический метод факториала из класса BigIntegerMath для вычисления факториала заданного числа:

public BigInteger factorialUsingGuava(int n) { return BigIntegerMath.factorial(n); }

4. Вывод

В этой статье мы увидели несколько способов вычисления факториалов с использованием ядра Java, а также нескольких внешних библиотек.

Мы впервые увидели решения с использованием длинного типа данных для вычисления факториалов чисел до 20 . Затем мы увидели несколько способов использования BigInteger для чисел больше 20.

Код, представленный в этой статье, доступен на Github.