Izračunaj faktorijel u Javi

1. Pregled

S obzirom na negativan cijeli broj n, faktorijel je umnožak svih pozitivnih cijelih brojeva manjih ili jednakih n.

U ovom ćemo brzom vodiču istražiti različiti načini izračuna faktora za zadani broj u Javi.

2. Faktorijal za brojeve do 20

2.1. Faktorijalno korištenje a za Petlja

Pogledajmo osnovni faktoristički algoritam pomoću a za petlja:

javni long factorialUsingForLoop (int n) {duga činjenica = 1; za (int i = 2; i <= n; i ++) {činjenica = činjenica * i; } vratiti cinjenicu; }

Gornje rješenje će uspjeti novčana kazna za brojeve do 20. Ali, ako pokušamo nešto veće od 20, onda to neće uspjeti jer rezultati bi bili preveliki da bi se mogli uklopiti u dugo, uzrokujući preljev.

Pogledajmo još nekoliko, uz napomenu da svaki od njih to će raditi samo za male brojeve.

2.2. Factorial pomoću Java 8 strujanja

Također možemo koristiti i Java 8 Stream API za prilično jednostavno izračunavanje činjenica:

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

U ovom programu prvo koristimo LongStream prelistavati brojeve između 1 i n. Tada smo koristili smanjiti(), koji koristi vrijednost identiteta i funkciju akumulatora za korak smanjenja.

2.3. Faktorijalno korištenje rekurzije

I pogledajmo još jedan primjer faktora programa, ovaj put koji koristi rekurziju:

public long factorialUsingRecursion (int n) {if (n <= 2) {return n; } return n * factorialUsingRecursion (n - 1); }

2.4. Factorial koristeći Apache Commons Math

Apache Commons Math ima KombinatorikaKorisništvo razred sa statičkim faktorijel metoda koju možemo koristiti za izračunavanje faktora.

Da bismo uključili Apache Commons Math, dodati ćemo commons-math3 ovisnost o našoj pom:

 org.apache.commons commons-math3 3.6.1 

Pogledajmo primjer pomoću KombinatorikaKorisništvo razred:

javni dugi factorialUsingApacheCommons (int n) {return CombinatoricsUtils.factorial (n); }

Primijetite da je njegov povratni tip dugo, baš kao i naša domaća rješenja.

To ovdje znači da ako izračunata vrijednost premaši Dugo.MAX_VALUE, a MathArithmeticException baca se.

Da bi bilo veće, trebat će nam drugačiji tip povrata.

3. Faktorijal za brojeve veće od 20

3.1. Faktorska upotreba BigInteger

Kao što je već spomenuto, dugo tip podataka može se koristiti za činjenice samo za n <= 20.

Za veće vrijednosti n, možemo koristiti BigInteger razred od java.math paket koji može primiti vrijednosti do 2 ^ Cijeli broj.MAX_VALUE:

javni BigInteger factorialHavingLargeResult (int n) {BigInteger rezultat = BigInteger.ONE; za (int i = 2; i <= n; i ++) rezultat = rezultat.množiti (BigInteger.valueOf (i)); povratni rezultat; }

3.2. Factorial pomoću Guave

Googleova knjižnica Guava također nudi korisnu metodu za izračunavanje faktora za veće brojeve.

Da bismo uključili knjižnicu, možemo dodati njezin guava ovisnost o našoj pom:

 com.google.guava guava 25,1-jre 

Sada možemo koristiti statiku faktorijel metoda iz BigIntegerMath klasa za izračunavanje faktora datog broja:

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

4. Zaključak

U ovom smo članku vidjeli nekoliko načina izračunavanja činjeničnih podataka pomoću jezgre Java, kao i nekoliko vanjskih knjižnica.

Prvo smo vidjeli rješenja pomoću dugo vrsta podataka za izračun faktora od brojeva do 20. Zatim smo vidjeli nekoliko načina za korištenje BigInteger za brojeve veće od 20.

Kôd predstavljen u ovom članku dostupan je na Githubu.