Hitung Factorial di Jawa

1. Gambaran keseluruhan

Diberi bilangan bulat bukan negatif n , faktorial adalah produk semua bilangan bulat positif kurang daripada atau sama dengan n .

Dalam tutorial ringkas ini, kita akan meneroka pelbagai cara untuk mengira faktorial bagi nombor tertentu di Java .

2. Faktor faktor untuk Nombor hingga 20

2.1. Factorial Menggunakan a untuk Gelung

Mari lihat algoritma faktorial asas menggunakan gelung untuk :

public long factorialUsingForLoop(int n) { long fact = 1; for (int i = 2; i <= n; i++) { fact = fact * i; } return fact; }

Penyelesaian di atas akan berfungsi dengan baik untuk nombor hingga 20 . Tetapi, jika kita mencuba sesuatu yang lebih besar dari 20, maka ia akan gagal kerana hasilnya terlalu besar untuk dimasukkan dalam jangka panjang , menyebabkan limpahan.

Mari kita lihat beberapa lagi, perhatikan bahawa masing-masing hanya akan berfungsi untuk sebilangan kecil.

2.2. Faktorial Menggunakan Java 8 Stream

Kami juga dapat menggunakan Java 8 Stream API untuk mengira faktorial dengan mudah:

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

Dalam program ini, pertama kami menggunakan LongStream untuk mengulang nombor antara 1 dan n . Kami kemudian menggunakan mengurangkan () , yang menggunakan nilai identiti dan fungsi akumulator untuk langkah pengurangan.

2.3. Faktorial Menggunakan Pengulangan

Dan mari kita lihat contoh lain dari program faktorial, kali ini menggunakan rekursi:

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

2.4. Factorial Menggunakan Matematik Apache Commons

Apache Commons Math mempunyai kelas CombinatoricsUtils dengan kaedah faktorial statik yang boleh kita gunakan untuk mengira faktorial.

Untuk memasukkan Apache Commons Math, kami akan menambahkan kebergantungan commons-math3 ke pom kami :

 org.apache.commons commons-math3 3.6.1 

Mari lihat contoh menggunakan kelas CombinatoricsUtils :

public long factorialUsingApacheCommons(int n) { return CombinatoricsUtils.factorial(n); }

Perhatikan bahawa jenis pengembaliannya panjang , sama seperti penyelesaian dari rumah kita.

Ini bermaksud di sini bahawa jika nilai yang dikira melebihi Long.MAX_VALUE , MathArithmeticException akan dilemparkan.

Untuk menjadi lebih besar, kita memerlukan jenis pengembalian yang berbeza.

3. faktorial untuk nombor yang lebih besar daripada 20

3.1. Faktorial Menggunakan BigInteger

Seperti yang dibincangkan sebelumnya, jenis data panjang boleh digunakan untuk faktorial hanya untuk n <= 20 .

Untuk nilai n yang lebih besar , kita dapat menggunakan kelas BigInteger dari pakej java.math , yang dapat menahan nilai hingga 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. Faktor Menggunakan Jambu Batu

Perpustakaan Jambu Batu Google juga menyediakan kaedah utiliti untuk mengira faktorial untuk jumlah yang lebih besar.

Untuk memasukkan perpustakaan, kami dapat menambahkan kebergantungan jambu pada pom kami :

 com.google.guava guava 25.1-jre 

Sekarang, kita boleh menggunakan kaedah faktorial statik dari kelas BigIntegerMath untuk mengira faktorial nombor tertentu:

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

4. Kesimpulan

Dalam artikel ini, kami melihat beberapa cara untuk mengira faktorial menggunakan Java inti serta beberapa perpustakaan luaran.

Kami pertama kali melihat penyelesaian menggunakan jenis data panjang untuk mengira faktorial hingga 20 . Kemudian, kami melihat beberapa cara untuk menggunakan BigInteger untuk nombor yang melebihi 20.

Kod yang disajikan dalam artikel ini terdapat di Github.