Fungsi Rekursif
Halo semua, selamat datang kembali dalam tutorial Dev-C++.
Langsung saja, kali ini kita akan belajar mengenai fungsi rekursif. Pada
tutorial sebelumnya kita telah belajar mengenai fungsi dan cara memanggilnya,
kali ini fungsi yang akan kita pelajari kurang lebih sama dalam hal cara
memanggilnya tetapi lebih cenderung banyak perbedaannya. Apa saja yang
membedakan fungsi rekursif dari fungsi biasa? Mari kita simak tutorial berikut
ini.
Apa itu Fungsi Rekursif?
Pertama – tama, apa sih fungsi rekursif itu? Fungsi rekursif didefinisikan sebagai fungsi yang dapat memanggil dirinya sendiri. Jadi di dalam fungsi tersebut ada statement yang berisi nama fungsi tersebut, atau dengan kata lain perintah untuk memanggil dirinya (fungsi) itu sendiri. Nah, sekarang pertanyaannya adalah bagaimana caranya fungsi tersebut memanggil dirinya sendiri? Bagaimana mekanisme kode programnya?Cara Menulis Fungsi Rekursif
Jadi, masalah pada fungsi di atas adalah pemanggilan tidak
bisa berhenti sehingga kalimat di dalam cout keluar terus menerus! Untuk
menghentikan pemanggilan, dibutuhkan yang namanya base case, yaitu statement yang berisi suatu nilai yang akan
menghentikan pemanggilan fungsi. Untuk lebih jelasnya mengenai base case perhatikan contoh fungsi
berikut:
Saya memakai contoh fungsi yang sebelumnya, dan kali ini
jika kalian perhatikan baik – baik saya sudah menambahkan base case pada fungsi tersebut; Pada baris 4 telah ditambahkan int x untuk menentukan berapa kali
fungsi akan dipanggil, dan di dalam void
tulis() terdapat fungsi if dimana
fungsi akan selalu dipanggil jika nilai x > 0. Perhatikan pada baris 9,
dapat kita lihat statement tersebut bahwa nilai x akan berkurang 1 setiap kali
fungsi dipanggil, jadi jika nilai x sudah bernilai 0 maka di saat itulah fungsi
tersebut berhenti memanggil. Untuk lebih jelasnya perhatikan gambar berikut:
Terlihat pada hasil program di atas, bahwa kalimat “Selamat
dating di Fungsi Rekursif!” sudah tidak lagi banyak seperti hasil sebelumnya.
Ini dikarenakan kode program utama int main()
memanggil fungsi tulis sebanyak 5
kali, dan pada void tulis() akan
mengurangi nilai pemanggilan sampai 0.
Selain membuat fungsi rekursif yang menampilkan kalimat/string, kita juga dapat menggunakan fungsi rekursif ini untuk perhitungan matematika seperti faktorial berikut:
- 1! = 1
- 2! = 2*1 = 2
- 3! = 3*2*1 = 6
Dari contoh di atas dapat kita lihat bahwa untuk n = 1, jadi nilai faktorialnya dapat langsung diketahui. Maka dari itu, kita menggunakan base case-nya adalah n = 1. Perhatikanlah contoh program berikut:
Dengan menggunakan variable n = 1 sebagai base case pada baris 7, kita dapat
melihat bahwa hasil program adalah 1 dikarenakan ada return(1) pada baris 9 yang mengembalikan nilai 1. Dan pada baris
11 variabel hasil menghitung nilai n yang akan dihitung dikalikan nilai n – 1
sampai nilai n = 1, sehingga jika misalkan variable n = 3 maka perhitungan
secara teori adalah 3! = 3*2*1 = 6. Saat dijalankan program di atas hasilnya
akan menjadi seperti berikut:
Untuk kasus ini saya mengisikan nilai yang ingin dihitung
pada program baris 19 dengan angka 5 sehingga saat dihitung menjadi 5! =
5*4*3*2*1 dengan hasil akhirnya 120.
Sebagai contoh berikutnya, kita akan membuat fungsi
menjumlahkan kuadrat bilangan m sampai n, dengan harga awal m <= n sesuai
persamaan berikut:
Sumsq(m,n)
= m2+ (m+1)2+(m+2)2+ … + n2
Untuk persamaan di atas jika m == n maka solusi langsung
didapat dengan demikian ditetapkan base
case-nya adalah m==n. Coba perhatikanlah program berikut:
Di atas adalah program untuk menjumlahkan bilangan kuadrat,
pada program berikut nilai m berperan sebagai bilangan yang akan bertambah 1
setiap kali fungsi sumsq_rec dipanggil,
dan nilai n akan berperan sebagai titik stop pemanggilan fungsi tersebut. Base case yang dipakai di sini adalah m==n, jadi jika kita mengisi nilai m = 2 dan n = 2, maka hasil yang didapat
adalah 4 karena saat diuraikan dengan rumus fungsi di atas maka akan menjadi Sumsq_rec = 22 = 4, dan
karena nilai m = n maka pemanggilan fungsi akan berhenti. Tentu saja saat kode
program di atas dijalankan kita dapat memasukkan nilai m dan n sesuai yang kita
inginkan. Perhatikan contoh hasil program berikut:
Dari hasil di atas dapat kalian lihat bahwa saya memasukkan
nilai m = 2 dan n = 4, dan hasil yang didapatkan adalah 29. Ini dikarenakan
saat diuraikan dengan rumus fungsi Sumsq(m,n),
maka akan menjadi seperti berikut:
Sumsq(m,n) = Sumsq(2,4) = 22+32+42
= 4 + 9 + 16 = 29
Ada beberapa cara untuk mendapatkan base case di atas, program di atas disebut going up recursion (rekursif naik). Cara yang lain adalah dengan going down recursion (rekursif turun),
dan division in half recursion
(rekursif bagi dua). Berikut saya akan terangkan fungsi rekursif turun terlebih
dahulu:
Program di atas adalah program rekursif turun, kebalikannya
dari rekursif naik sebelumnya tetapi menghasilkan hasil yang sama. Yang
membedakannya adalah proses perhitungan dan pemanggilan fungsi pada baris 8 dimana
yang berubah adalah nilai n sedangkan nilai m tetap. Misalkan jika nilai m = 2
dan nilai n = 4 maka jika kita lihat baris 8 maka yang berubah adalah nilai n
yang dihitung mundur sampai nilai n = m, sehingga hasilnya adalah sebagai
berikut:
Selanjutnya, berikut fungsi rekursif bagi dua:
Di atas adalah program fungsi rekursif bagi dua, rumus yang
digunakan tetap perhitungan penjumlahan bilangan kuadrat, dengan cara
pemanggilan berbeda dari kedua kode program sebelumnya. Jika kita perhatikan
baik – baik pada baris 13, maka bisa dilihat bahwa fungsi sumsq_rec_3 dipanggil 2 kali untuk dijumlahkan dengan memanfaatkan
variabel int mid pada baris 12.
Jadi, saat dijabarkan, jika misalkan nilai m = 2 dan n = 6, maka akan dihitung
terlebih dahulu variabel mid = (2+6)/2 = 4, dan hasilnya akan menjadi sumsq_rec_3(2,4) + sumsq_rec_3(5,6) = (22+32+42)
+ (52+62). Berikut adalah hasil akhir perhitungan
program di atas:
Oke, kita telah selesai membahas mengenai fungsi rekursif, dan bisa disimpulkan bahwa fungsi rekursif bekerja seperti program perulangan namun terpisah, dan untuk menghentikan perulangan pemanggilan fungsi, kita harus tentukan base case-nya yang membatasi pemanggilan, dan fungsi rekursif ini juga dapat digunakan untuk menghitung operasi matematika. Demikianlah tutorial mengenai fungsi rekursif telah berakhir, semoga dapat berguna bagi kalian para pembaca. Terimakasih, dan sampai bertemu lagi pada tutorial berikutnya.
Comments
Post a Comment