JavaRush /Blog Jawa /Random-JV /Faktorial in Java Programming

Faktorial in Java Programming

Diterbitake ing grup
Dina iki kita bakal ngomong babagan faktorial. Iki salah siji saka fungsi paling dhasar sing programmer kudu ngerti, lan ing wektu sing padha bisa karo. Dadi ayo miwiti. Faktorial saka n yaiku nilai produk (perkalian) saka kabeh nomer alami saka 1 nganti n, sing dituduhake minangka n! Apa sing katon:
1! =  1
2! =  1 * 2 = 2
3! =  1 * 2 * 3 = 6
4! =  1 * 2 * 3 * 4 = 24
5! =  1 * 2 * 3 * 4 * 5  = 120
Lan siji aturan cilik liyane, kanggo 0:
!0  = 1
Yen kita pengin, contone, kanggo njaluk beda faktorial 6! ugi 4:!
6!-4! = 1⋅2⋅3⋅4⋅5⋅6 - 1⋅2⋅3⋅4 = 720 - 24 = 696
Ayo goleki kaya apa iki ing Jawa lan ngerti sawetara cara kanggo ngitung faktorial.

Solusi biasa

public static int getFactorial(int f) {
  int result = 1;
  for (int i = 1; i <= f; i++) {
     result = result * i;
  }
  return result;
}
Ora ana sing rumit: kita nggunakake nomer sing ditampa minangka ukuran siklus kita, ing ngendi kita tikel kabeh nomer sadurunge nganti tekan f. Lan ing utama:

System.out.println(getFactorial(6) - getFactorial(4));
Kita mriksa lan entuk asil sing dikarepake: 696.

Solusi rekursif

Rekursi nindakake sawetara logika kanthi nyebutake metode kasebut dhewe. Cara iki diarani rekursif. Biasane kasusun saka rong bagean:
  1. kondisi metu cara, sawise tekan kang cara kudu mungkasi nelpon dhewe lan miwiti maringaken nilai munggah. Yen ora, kita bakal entuk loop tanpa wates saka nelpon metode dhewe lan, minangka asil, StackOverflowError .

  2. sawetara Processing (logika) perlu ing kahanan tartamtu + nelpon dhewe, nanging karo nilai mlebu beda.

Conto becik kanggo rekursi saiki yaiku nemokake faktorial:
public static int getFactorial(int f) {
  if (f <= 1) {
     return 1;
  }
  else {
     return f * getFactorial(f - 1);
  }
}
Kita nyetel kondisi kanggo metu saka recursion nalika tekan 1. Yen bantahan ora 1, banjur kita Multiply Nilai saiki dening asil saka telpon sabanjuré kanggo cara iki (ngendi kita ngirim Nilai saiki -1).

Solusi karo Stream

Kanggo sing ora ngerti fungsi stream utawa sing pengin refresh memori, bakal migunani kanggo maca iki .
public static int getFactorial(int f) {
  if (f <= 1) {
     return 1;
  }
  else {
     return IntStream.rangeClosed(2, f).reduce((x, y) -> x * y).getAsInt();
  }
}
Ing kene kita nggunakake kelas khusus IntStream, sing nyedhiyakake kemampuan tambahan nalika nggarap stream saka nilai int. Kanggo nggawe stream kasebut, kita nggunakake metode statis rangeClosed, sing nggawe nilai saka 2 nganti f inklusif kanthi langkah 1. Sabanjure, kita gabungke kabeh nilai nggunakake metode nyuda, yaiku, kita nuduhake carane kita pengin gabungke. Pungkasan, kita entuk nilai asil nggunakake metode terminal getAsInt.

Nggunakake BigInteger

Ing Jawa, kelas BigInteger asring digunakake kanggo nangani angka, utamane BIG . Sawise kabeh, yen kita nggunakake int, banjur faktorial maksimum sing bisa kita njupuk tanpa kelangan data 31, kanggo dawa - 39. Nanging yen kita perlu faktorial 100? Ayo goleki solusi sadurunge, nanging nggunakake BigInteger. Faktorial ing pemrograman Java - 2

Solusi biasa

public static BigInteger getFactorial(int f) {
  BigInteger result = BigInteger.ONE;
  for (int i = 1; i <= f; i++)
     result = result.multiply(BigInteger.valueOf(i));
  return result;
}
Algoritma pancacahan iku ateges padha, nanging kene kita nggunakake Kapabilitas BigInteger: BigInteger.ONE - kanggo nyetel Nilai wiwitan kanggo 1. multiply - pingan antarane Nilai faktorial sadurungé lan nomer saiki.

Solusi rekursif

public static BigInteger getFactorial(int f) {
  if (f <= 1) {
     return BigInteger.valueOf(1);
  }
  else {
     return BigInteger.valueOf(f).multiply(getFactorial(f - 1));
  }
}
Logika umum solusi ora owah, kajaba sawetara cara kanggo nggarap BigInteger ditambahake.

Solusi karo Stream

public static BigInteger getFactorial(int f) {
  if (f < 2) {
     return BigInteger.valueOf(1);
  }
  else {
     return IntStream.rangeClosed(2, f).mapToObj(BigInteger::valueOf).reduce(BigInteger::multiply).get();
  }
}
Ateges kabeh padha, nanging karo BigInteger. Ing stream saiki kita duwe metode mapToObj, sing kita ngowahi nilai int menyang BigInteger supaya bisa nambah bebarengan kanthi nggunakake multiply (uga, kita nambahake njupuk obyek saka pambungkus Opsional ). Yen kita mbukak salah siji saka telung cara iki kanthi argumen 100, mula kita ora bakal kebanjiran lan bakal entuk:

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION