CodeGym /Blog Jawa /Acak /Program Jawa kanggo faktorial
John Squirrels
tingkat
San Francisco

Program Jawa kanggo faktorial

Diterbitake ing grup
Dina iki kita bakal ngomong babagan faktorial lan cara sing paling umum kanggo nemokake faktorial. Iki salah siji saka fungsi paling dhasar sing programmer kudu ngerti lan bisa digunakake. Inggih, ayo miwiti. Faktorial saka nomer n, dilambangake minangka n!, yaiku nilai produk (perkalian) kabeh nomer alami saka 1 nganti n. Iki kaya apa (ayo refresh kawruh babagan matematika):
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 ana siji aturan cilik kanggo 0:
!0 = 1
Yen kita arep ngetung prabédan antarane 6! ugi 4:!
6!-4! = 1⋅2⋅3⋅4⋅5⋅6 - 1⋅2⋅3⋅4 = 720 - 24 = 696
Ayo ndeleng apa iki bakal katon nalika dileksanakake ing program. Kita bakal njelajah sawetara cara kanggo ngetung faktorial ing basa Jawa.

Solusi biasa ing program faktorial

Mangkene program faktorial prasaja nggunakake loop:

class FactorialExample{  
 public static void main(String args[]){  
  int i,fact=1;  
  int number=7;// our number to do the necessary calculations in class Factorial    
  for(i=1;i<=number;i++){    
      fact=fact*i;    
  }    
  System.out.println("Factorial of "+number+" is: "+fact);    
 }  
}
Output kita ing konsol bakal dadi:
Faktorial saka 7 yaiku: 5040
Lan conto liyane kanggo ngurutake:

public static int getFactorial(int f) {
  int result = 1;
  for (int i = 1; i <= f; i++) {
     result = result * i; // finding factorial of number using loops
  }
  return result;
}
Ora ana sing angel: kita nggunakake nomer sing dilewati minangka ukuran daur ulang, sing dikalikake kabeh nomer sadurunge nganti tekan f. Lan ing utama:

System.out.println(getFactorial(6) - getFactorial(4));
Nguji kode kasebut, kita ndeleng manawa entuk asil sing dikarepake: 696.

Solusi rekursif

Rekursi kedadeyan nalika cara nelpon dhewe. Cara kang kaya mangkono diarani metode rekursif. Minangka aturan, kasusun saka rong bagean:
  1. A kondisi terminating — nalika kondisi terminating wareg, cara kudu mungkasi nelpon dhewe lan miwiti maringaken nilai munggah. Sawise kabeh, yen ora ana kondisi terminating, banjur kita bakal duwe loop tanpa wates, kanthi cara nelpon dhewe bola-bali nganti entuk StackOverflowError .
  2. Punapa mawon logika kahanan mbutuhake plus telpon rekursif, nanging karo nilai input beda.
Nemokake faktorial ing Jawa minangka conto sampurna nalika nggunakake rekursi:

public static int getFactorial(int f) { // finding factorial of number using recursive solution
  if (f <= 1) {
     return 1;
  }
  else {
     return f * getFactorial(f - 1);
  }
}
Kawontenan terminating recursion kita bakal nalika kita tekan 1. Yen parameter ora 1, banjur kita Multiply Nilai saiki dening asil saka telpon rekursif sabanjuré kanggo cara (kang kita pass Nilai saiki minus 1).

Solusi karo Stream

Sapa wae sing ora kenal karo fungsi Java Stream, utawa sapa wae sing pengin refresh memori, bakal entuk manfaat saka maca babagan kene .

public static int getFactorial(int f) { // finding factorial of number using Stream 
  if (f <= 1) {
     return 1;
  }
  else {
     return IntStream.rangeClosed(2, f).reduce((x, y) -> x * y).getAsInt();
  }
}
Ing kene kita nggunakake kelas IntStream khusus , sing menehi kemampuan tambahan nalika nggarap aliran nilai int. Kanggo nggawe stream kasebut, kita nggunakake cara statis rangeClosed , sing ngasilake nilai saka 2 nganti f, kalebu, kanthi tambahan 1. Sabanjure, kita nggunakake metode nyuda kanggo nggabungake kabeh nilai. Luwih khusus, kita nuduhake carane kita pengin nggabungake nilai kasebut. Pungkasan, kita entuk nilai asil nggunakake metode getAsInt terminal .

Nggunakake BigInteger

Ing Jawa, kelas BigInteger asring digunakake kanggo nangani angka, utamane nomer BIG. Pancen, yen kita nggunakake int , banjur faktorial maksimum sing bisa kita nangani tanpa mundhut data punika 31. Kanggo jinis data dawa , faktorial maksimum punika 39. Nanging yen kita perlu faktorial saka 100? Ayo ngganti solusi sadurunge menyang BigInteger.Program Java kanggo faktorial - 2

Solusi biasa


public static BigInteger getFactorial(int f) { // finding factorial of number using BigInteger
  BigInteger result = BigInteger.ONE;
  for (int i = 1; i <= f; i++)
     result = result.multiply(BigInteger.valueOf(i));
  return result;
}
Algoritma punika ateges padha, nanging kene kita nggunakake Kapabilitas BigInteger: BigInteger.ONE punika Nilai wiwitan 1, lan multiply () digunakake kanggo Multiply 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 ditambahake kanggo nggarap BigInteger.

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();
  }
}
Kabeh iku ateges padha, nanging karo BigInteger. Kelas Stream menehi kita cara mapToObj , kang digunakake kanggo Ngonversi nilai int kanggo BigInteger supaya banjur Multiply karo dhewe nggunakake cara multiply (lan njaluk () ditambahake kanggo njaluk obyek saka pambungkus Pilihan ). Yen kita mbukak salah siji saka telung cara iki kanthi argumen 100, mula kita bakal ngindhari tumpukan tumpukan lan entuk asil sing bener:
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463987285625282525285252525252852525252525252525253 11852109168640000000000000000000000
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION