Bereken Factorial in Java

1. Overzicht

Gegeven een niet-negatief geheel getal n, faculteit is het product van alle positieve gehele getallen kleiner dan of gelijk aan n.

In deze korte tutorial gaan we op verkenning verschillende manieren om faculteit te berekenen voor een bepaald getal in Java.

2. Factorial voor getallen tot 20

2.1. Factorial met behulp van een voor Lus

Laten we eens kijken naar een elementair factorieel algoritme met een voor lus:

openbare lange factorialUsingForLoop (int n) {long fact = 1; voor (int i = 2; i <= n; i ++) {feit = feit * i; } terugkeer feit; }

De bovenstaande oplossing zal werken prima voor nummers tot 20. Maar als we iets proberen dat groter is dan 20, zal het mislukken omdat resultaten zouden te groot zijn om in een te passen lang, waardoor een overloop ontstaat.

Laten we er nog een paar bekijken, waarbij we opmerken dat elk van deze werken alleen voor kleine aantallen.

2.2. Factorial met behulp van Java 8-streams

We kunnen ook de Java 8 gebruiken Stroom API om faculteiten vrij gemakkelijk te berekenen:

openbare long factorialUsingStreams (int n) {retourneer LongStream.rangeClosed (1, n) .reduce (1, (long x, long y) -> x * y); }

In dit programma gebruiken we eerst LongStream om de getallen tussen 1 en te doorlopen n. We gebruikten toen verminderen(), die een identiteitswaarde en accumulatorfunctie gebruikt voor de reductiestap.

2.3. Factorial met behulp van recursie

En laten we nog een voorbeeld bekijken van een faculteitsprogramma, deze keer met recursie:

openbare lange faculteitUsingRecursion (int n) {if (n <= 2) {return n; } retourneer n * factorialUsingRecursion (n - 1); }

2.4. Factorial met behulp van Apache Commons Math

Apache Commons Math heeft een CombinatoricsUtils klasse met een static faculteit methode die we kunnen gebruiken om de faculteit te berekenen.

Om Apache Commons Math op te nemen, voegen we de commons-math3 afhankelijkheid van onze pom:

 org.apache.commons commons-math3 3.6.1 

Laten we een voorbeeld bekijken met de CombinatoricsUtils klasse:

openbare lange factorialUsingApacheCommons (int n) {return CombinatoricsUtils.factorial (n); }

Merk op dat het retourtype is lang, net als onze zelfgekweekte oplossingen.

Dat betekent hier dat als de berekende waarde groter is dan Lang.MAX_VALUE, een MathArithmeticException wordt gegooid.

Om nog groter te worden, we hebben een ander retourtype nodig.

3. Faculteit voor getallen groter dan 20

3.1. Factoriaal gebruik BigInteger

Zoals eerder besproken, is de lang datatype kan alleen worden gebruikt voor faculteiten voor n <= 20.

Voor grotere waarden van n, we kunnen de BigInteger klasse van de java.math pakket, dat kan bevatten waarden tot 2 ^ Geheel getal.MAX_VALUE:

openbare BigInteger factorialHavingLargeResult (int n) {BigInteger resultaat = BigInteger.ONE; voor (int i = 2; i <= n; i ++) resultaat = resultaat.multiply (BigInteger.valueOf (i)); resultaat teruggeven; }

3.2. Factorial met behulp van Guava

De Guava-bibliotheek van Google biedt ook een hulpprogramma voor het berekenen van faculteiten voor grotere aantallen.

Om de bibliotheek op te nemen, kunnen we de guave afhankelijkheid van onze pom:

 com.google.guava guave 25.1-jre 

Nu kunnen we de static gebruiken faculteit methode van de BigIntegerMath klasse om de faculteit van een bepaald getal te berekenen:

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

4. Conclusie

In dit artikel hebben we een paar manieren gezien om faculteiten te berekenen met behulp van core Java en een aantal externe bibliotheken.

We zagen voor het eerst oplossingen met behulp van de lang gegevenstype voor het berekenen van faculteiten van getallen tot 20. Toen zagen we een aantal manieren om te gebruiken BigInteger voor getallen groter dan 20.

De code die in dit artikel wordt gepresenteerd, is beschikbaar op Github.


$config[zx-auto] not found$config[zx-overlay] not found