1. Общ преглед
Като се има предвид отрицателно цяло число n , факториалът е произведението на всички положителни цели числа, по-малки или равни на n .
В този бърз урок ще проучим различни начини за изчисляване на факториал за дадено число в Java .
2. Факториал за числа до 20
2.1. Факториал с помощта на for Loop
Нека да видим основен факториален алгоритъм, използващ цикъл 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 . След това използвахме намаление () , което използва стойност на идентичност и функция акумулатор за стъпката на намаляване.
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, ще добавим зависимостта 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 предоставя и полезен метод за изчисляване на факториали за по-големи числа.
За да включим библиотеката, можем да добавим нейната зависимост от гуава към нашата pom :
com.google.guava guava 25.1-jre
Сега можем да използваме статичния факториален метод от класа BigIntegerMath, за да изчислим факториала на дадено число:
public BigInteger factorialUsingGuava(int n) { return BigIntegerMath.factorial(n); }
4. Заключение
В тази статия видяхме няколко начина за изчисляване на факториали с помощта на основната Java, както и няколко външни библиотеки.
За първи път видяхме решения, използващи дългия тип данни за изчисляване на факториали на числа до 20 . След това видяхме няколко начина да използваме BigInteger за числа, по-големи от 20.
Кодът, представен в тази статия, е достъпен в Github.