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.