Розрахувати факторіал на 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 Streams

Ми також можемо використовувати API Java 8 Stream для обчислення факторіалів досить легко:

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

Apache Commons Math має клас CombinatoricsUtils із статичним факторіальним методом, який ми можемо використовувати для обчислення факторіалу.

Щоб включити Apache Commons Math, ми додамо Загально-math3 залежності в наш П :

 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 також пропонує корисний метод для розрахунку факторів для більших чисел.

Щоб включити бібліотеку, ми можемо додати її залежність гуави до нашого пом :

 com.google.guava guava 25.1-jre 

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

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

4. Висновок

У цій статті ми побачили кілька способів обчислення факторіалів за допомогою базової Java, а також пари зовнішніх бібліотек.

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

Код, представлений у цій статті, доступний на Github.