Faktorial iterasi di Java (Android)

Pada postingan sebelumnya, kita menggunakan metode rekursif untuk menghitung faktorial. Kelemahan metode ini adalah dia akan terus melakukan push stack sehingga stack kita bisa saja menjadi overflow (melimpah). Jumlah stack tidak sama untuk tiap JVM, jadi kita tidak bisa memperkirakannya, karena error Stack Overflow terjadi saat runtime di client, bukanlah saat compiling …

Nah, alternatif perhitungan faktorial adalah dengan iterasi, yaitu perulangan.

Kode dapat dilihat di sini:

public void onClickFaktorial(View view){
    EditText i = (EditText) findViewById(R.id.editTextInput);
    EditText o = (EditText) findViewById(R.id.editTextHasil);
o.setText("");//clear
BigInteger bigI = new BigInteger(i.getText().toString());
Log.d("onClickFaktorial","bigI="+bigI.toString());

Perhitungan dilakukan dengan membuat BigInteger b, yang menampung hasil perkalian iterasi tersebut:

b = multiplied(BigInteger.ONE, bigI);
o.setText(b.toString());
} // end onClickFaktorial

dimana fungsi multiplied itu fungsi private kita, dapat dilihat berikut:

private static BigInteger multiplied(BigInteger start, BigInteger stop){
    Log.d("multiplied","start="+start+", stop="+stop);
    //jika start lebih besar dari stop, return satu
    if(start.compareTo(stop)> 0) return BigInteger.ONE;

    BigInteger result = start;
    BigInteger factor = start.add(BigInteger.ONE);

    // perhatikan bahwa compareTo <1 artinya 0 atau -1 ... "less than or equals" ... <=
    for (; factor.compareTo(stop)< 1; factor=factor.add(BigInteger.ONE)) {
        Log.d("multiplied",factor.toString());
        result = result.multiply(factor);
    }

    return result;
}

Fungsi private kita inilah yang berguna untuk menghitung perkalian faktorial, tetapi dimulai dari 2 dikalikan terus sampai bilangan target, stop…

Kenapa terlihat rumit, karena untuk BigInteger, kita tidak dapat menggunakan angka 1, tidak dapat juga melakukan perbandingan dengan tanda >, atau < atau besarsama dan kecil sama seperti bilangan lainnya.

Untuk memudahkan Anda melakukan debugging, saya tambahkan baris Log.d, sehingga nanti akan keluar lognya di Android Studio Anda.

Silahkan lihat bahwa sekarang Android Anda lebih hebat dari calc Windows Anda …

30 000 faktorial

 

Advertisements

Faktorial Rekursif di Java (Android)

Faktorial

Anda dapat melakukan perhitungan faktorial dengan class final dibawah ini,

import java.math.BigInteger;
public final class fak{
public static BigInteger f(int x){
return (x<=1) ? BigInteger.ONE:f(x-1).multiply(BigInteger.valueOf(x));
}
}

nantinya, di Android, tinggal tambahkan tombol , cari atribut onClick nya, isi dengan onClickFaktorial, lalu di kodingan javanya, tambahkan fungsi ini:

public void onClickFaktorial(View view){
EditText i = (EditText) findViewById(R.id.editTextInput);//.getText().toString();

//it’s final now, so … no need to create an instance
BigInteger b = fak.f(Integer.parseInt(i.getText().toString()));

EditText o = (EditText) findViewById(R.id.editTextHasil);
o.setText(b.toString());
}

Nah, seperti yang kita demokan di kelas, stack di Java tidak cukup untuk melakukan perhitungan 600!, tapi masih bisa 500!

Untuk kesempatan berikut, insyaAllah akan saya ulas tentang metode iterasistack overflow