Fungsi Rekursif dan Penerapannya di PHP

Fungsi merupakan bagian yang tidak terpisahkan dari konsep bahasa pemrograman. Dengan adanya fungsi, akan meningkatkan readibility (kemudahan untuk dibaca), modularity (pemecahan program menjadi modul-modul) dan reusability (dapat digunakan kembali) program kita. Lalu apa itu fungsi rekursif? Singkatnya, fungsi rekursif adalah suatu fungsi yang memanggil dirinya sendiri. Jadi di dalam suatu fungsi rekursif terdapat pemanggilan terhadap dirinya sendiri.

Penasaran? Dalam tutorial kali ini, saya akan menyajikan beberapa contoh sederhana penerapan fungsi rekursif di bahasa pemrograman PHP. Pada akhir tutorial, akan dicontohkan penggunaan fungsi rekursif dalam menampilkan menu bertingkat yang diambil dari database MySQL.

Fungsi rekursif biasanya digunakan untuk menyelesaikan permasalahan yang memiliki keteraturan pola dalam prosesnya, contohnya dalam menyelesaikan soal menampilkan deret bilangan. Salah satu kelebihan penggunaan fungsi rekursif adalah secara penulisan code program akan lebih singkat dan efektif. Namun kekurangannya tidak terlalu efektif secara performa dan waktu eksekusi program karena fungsi rekursif membutuhkan resources memory yang lebih besar. Dan jika tidak hati-hati dalam mendefinisikan proses di dalam fungsi rekursif, seringkali menghasilkan proses yang tidak pernah berhenti (infinitive process).

Menghitung Faktorial dengan Rekursif

Salah satu contoh yang paling mudah untuk menjelaskan fungsi rekursif adalah faktorial. Kita tahu bahwa dalam matematika, faktorial dari bilangan asli n adalah hasil perkalian antara bilangan bulat positif yang kurang dari atau sama dengan n. Faktorial ditulis sebagai n! dan disebut n faktorial. Sebagai contoh 5! = 5 x 4 x 3 x 2 x 1 = 120.

Jika dilihat dari keteraturan pola dalam menghitung nilai faktorial suatu bilangan, maka dapat diselesaikan dengan menggunakan fungsi biasa maupun fungsi rekursif. Perhatikan dan bandingkan kedua program berikut ini dimana program pertama tanpa rekursif dan program kedua dengan rekursif.

  1. <?php
  2.  
  3. function faktorial($n=1) {
  4. $hasil = 1;
  5. for($i=$n; $i >= 1; $i--) {
  6. $hasil = $hasil * $i;
  7. }
  8. return $hasil;
  9. }
  10.  
  11. echo "10! = ".faktorial(10);
  12.  
  13. ?>

Pada program di atas, proses menghitung nilai faktorial dilakukan dengan menggunakan perulangan. Sedangkan pada program di bawah ini, proses perhitungan dengan menggunakan fungsi rekursif. Di dalam fungsi terdapat pemanggilan fungsi diri sendiri dengan parameter ($n-1) yang dikalikan dengan $n.

  1. <?php
  2.  
  3. function faktorial($n=1) {
  4. if ($n==1) {
  5. return 1;
  6. } else {
  7. return $n * faktorial ($n-1);
  8. }
  9. }
  10.  
  11. echo "10! = ".faktorial(10);
  12.  
  13. ?>

Pada kedua contoh di atas mungkin tidak terlalu menonjol mengenai manfaat fungsi rekursif. Pada contoh yang lebih kompleks, misalnya melakukan penelusuran suatu graph atau tree, fungsi rekursif akan lebih tepat digunakan dibanding fungsi biasa.

Menampilkan Menu Bertingkat (Tree Menu) dengan Fungsi Rekursif

Menu atau navigasi merupakan bagian penting dan tidak dapat terpisahkan dari suatu halaman web. Menu yang kompleks biasanya diorganisasikan menjadi beberapa tingkat sedemikian hingga jika digambarkan akan terbentuk seperti diagram pohon. Menu tersebut sering disebut tree-menu. Untuk membuatnya pun sudah banyak dibahas di berbagai website, termasuk di website ini (baca kembali tutorial “Membuat Menu Bertingkat dengan JQuery jQSimpleMenu” dan “Membuat Menu Bertingkat (Tree Menu) dengan Dreamweaver“).

Pada bagian ini, saya tidak akan mengulang kembali bagaimana menggunakan library jQuery atau sejenisnya untuk membuat menu bertingkat, namun lebih pada bagaimana menyimpan menu bertingkat ke dalam database MySQL dan menampilkannya dalam bentuk unordered-list di HTML, tentunya dengan memanfaatkan fungsi rekursif.

Langsung saja, kita ikuti langkah-langkahnya:

Langkah #1. Buat database dan tabel untuk menyimpan informasi menu.

Saya asumsikan Anda sudah bisa membuat database di MySQL, baik dengan tools bantuan seperti PHPMyAdmin, MySQL Front, SQL Yog dll maupun dengan cara manual menggunakan mysql-console. Jika belum, coba pelajari buku gratis MySQL 5 yang dapat didownload di website ini. Setelah database dibuat, sekarang kita buat tabelnya, kurang lebih strukturnya sebagai berikut:

Kolom Tipe Data Keterangan
kd_menu int(5) Kode Menu
nm_menu varchar(50) Nama menu yang akan ditampilkan
link varchar(50) Link ke halaman menu
kd_parent int(5) Kode menu yang menjadi induknya. Menu yang paling atas diatur induk-nya 0.

Jika tabel sudah dibuat, isikan dengan beberapa contoh data. Bagi yang ga mau repot, saya sudah menyediakan perintah SQL untuk membuat tabel dan mengisi contoh datanya. Tinggal dijalankan di mysql client Anda.

Langkah #2. Buat fungsi rekursif dan jalankan.

Pada Program di bawah ini, akan dilakukan pengambilan data secara rekursif dari tabel menu yang sudah dibuat sebelumnya. Selanjutnya data akan ditampilkan dalam bentuk unordered-list (ul) di HTML.

  1. <?php
  2. #koneksi mysql
  3. mysql_connect("localhost","root","");
  4. #end koneksi
  5.  
  6. function html_menu(&$strmenu="", $parent=0) {
  7. $query = "SELECT kd_menu, kd_parent, nm_menu, link
  8. FROM menu WHERE kd_parent='$parent'
  9. ORDER BY kd_menu";
  10. //die ($query);
  11. $sql = mysql_query($query);
  12.  
  13. if (mysql_num_rows($sql) > 0) {
  14. $strmenu .= '<ul>';
  15. }
  16.  
  17. // tampilkan anaknya
  18. while ($row = mysql_fetch_assoc($sql)) {
  19.  
  20. $strmenu .= "<li>";
  21. $strmenu .= sprintf("<a href='%s' title='%s'>%s</a>", $row['link'], $row['nm_menu'], $row['nm_menu']);
  22.  
  23. //panggil diri sendiri
  24. html_menu($strmenu, $row['kd_menu']);
  25. $strmenu .= "</li>";
  26. }
  27.  
  28. if (mysql_num_rows($sql) > 0)
  29. $strmenu .= '</ul>';
  30.  
  31. }
  32.  
  33. $strmenu = "";
  34. html_menu($strmenu, 0);
  35. echo $strmenu;
  36. ?>

Berikut ini kurang lebih tampilan akhir jika program di atas dijalankan.

Tampilan Menu dalam bentuk Unordered-List

Demikian tutorial singkat ini, semoga ada manfaatnya untuk kita semua.

Referensi

Berbagi itu indah...Share on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0Pin on Pinterest0Digg this

21 comments

  1. Assalamu’alaikum,
    Ribuan terima kasih atas sharing ilmunya! Saya sering ‘sedot’ artikel & contoh2 program pak Achmatim, mohon di-ikhlaskan saudaramu ya !!!

    Wassalam,
    mus KT

  2. Dengan rekursif seperti itu kita akan melakukan koneksi ke database sebanyak jumlah menu, bikin lambat. Membuat menu seperti itu harusnya dengan Meload semua data diawal, lalu di mapping untuk membuat nya jadi bertingkat

    1. Terima kasih atas masukannya, tapi sebenarnya tidak sebanyak jumlah menu querynya melainkan sebanyak menu yg memiliki “anak”. Mapping data (misalkan dalam bentuk array) juga membutuhkan resources yg tidak sedikit. CMIIW

  3. nanya pak
    “function html_menu(&$strmenu=””, $parent=0) {”

    Sebelum variabel $strmenu ada “&” itu maksud nya apa ya pak?

  4. Selamat pagi gan, mau tanya gimana ya buat script PHP nya supaya buat input menu baru diatas? Yang saya baca kan diatas hanya nampilin data yang sudah ada di Database dan saya lihat input menuya via PHP My Admin, nah gmna kalau nput via Script PHP nya?

  5. Pak, klo menggunakan mysqli gimana yaa? saya cobain kok malah “Notice: Undefined variable: conn in D:\pekerjaan\keuangan\menu.php on line 8”?

Leave a Reply

Your email address will not be published. Required fields are marked *