Review Kuliah Pemrograman Terstruktur : Senin, 24 Oktober 2011

Yak, hari senin jam 09.00 seperti biasa kuliah PT bersama Pak Hari. Hari ini di bahas tentang fungsi dan rekursivitas. Rekursi itu
ekspresi yang menggunakan dirinya sendiri. Jadi misal ada suatu fungsi :
int Faktorial(int a)
{
if (a == 1)
return 1;
else
return a * Faktorial(a-1);
}

bisa di lihat dalam fungsi Faktorial, ada baris dimana fungsi itu memanggil dirinya sendiri. Ambil contoh Faktorial(4)
a = 4, fungsinya mengembalikan nilai 4 * Faktorial(3)
nah kita panggil lagi faktorial(3)
a = 3, fungsinya mengembalikan nilai 3 * Faktorial(2)
kemudian faktorial(2)
a = 2, mengembalikan nilai 2 * Faktorial(1)
di dalam fungsi Faktorial kan dicek, jika a == 1 return 1. Berarti Faktorial(1) = 1
kita kembalikan nilai Faktorial(1) ke Faktorial(2)
Faktorial(2) = 2 * 1 = 2
kemudian nilai ini dikembalikan ke fungsi Faktorial(3)
Faktorial(3) = 3 * 2 = 6
terakhir nilai Faktorial(3) dikembalikan ke fungsi Faktorial(4)
Faktorial(4) = 4 * 6 = 24
Kurang lebih seperti itu gambarannya, maaf kalau penjelasannya kurang baik hehe..

Perlu diperhatikan juga dalam membentuk suatu fungsi rekursif -> basis dan rekurens. Rekurens itu bagian yang memanggil dirinya sendiri (dalam fungsi faktorial adalah kondisi dimana a != 1). Sementara basis adalah bagian yang membatasi rekursi (dalam contoh ini adalah if (a == 1). Tanpa rekurens, sebuah fungsi bukanlah fungsi rekursif. Sementara fungsi dengan rekurens tanpa basis == INFINITE LOOP! Bakal stack overflow :O

Kelebihan dan kekurangan dari fungsi rekursif
Kelebihan : Permasalahan kompleks dengan pola perulangan tertentu dapat diselesaikan dengan fungsi yang berulang dimana isi fungsinya pendek (baca: hemat karakter == hemat ngetik == lebih cepet selese coding :D)
Kekurangan : 1. Menurut saya sih terkadang agak susah juga nentuin percabangannya
2. Memorynya GueDheeee...

Kesimpulannya : kalo memang suatu permasalahan dengan batasan yang gak strict(baca:bisa di brutal) dan solusinya butuh perulangan, ya boleh aja pake fungsi rekursif. Tapi kalo limitnya strict (misal n nya gedee), lebih baik pake iterasi/loop aja. Soalnya baca kekurangan poin 2 : Memorynya GueDheeee... Tepat sekali! Setiap pemanggilan fungsi, memorynya tetep dialokasiin ke pemanggilan fungsi itu sampai fungsinya selesai. Contoh : misal 1 kali call Faktorial(a) = 300 KB. Kalau Faktorial(4) berarti kan manggil Faktorial sampe 4 kali, berarti memory usagenya = 4 * 300 = 1.2 MB. Gede kan ? Saran saya sih, kalo memang bisa pake loop ya di loop aja :D

Tambahan : kalo ga salah di ajarin deklarasi fungsi juga deh, deklarasi fungsi bisa di bawah fungsi main atau di atas fungsi main atau dua dua nya (nah lo bingung ?)
contoh :
int fungsiapa(int a)
{
blablabla;
}

int main(void)
{
blablablalagi;
}

atau bisa juga

int main(void)
{
blablablalagi;
}

int fungsiapa(int a)
{
blablabla;
}

atau bisa juga (ini biasanya yang saya pake)
int fungsiapa(int a);

int main(void)
{
blablablalagi;
}

int fungsiapa(int a)
{
blablabla;
}

yang bentuk ketiga ini aku baca entah dimana pake yang namanya prototype function. Jadi int fungsiapa(int a); ini kan baru dideklarasiin aja bahwa fungsi itu ada(ini yang namanya prototype function). Nah di bawahnya fungsi main baru dijelasin fungsi itu ngapain aja.

0 comments:

Post a Comment