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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s