Pengertian Rekursif OPERASI STRING

356 Direktorat Pembinaan SMK | 2008 kondisi‐rekurensi : F ekspresi ‐2 Fungsi rekursif tidak langsung merupakan realisasi fungsi yang dapat cross-recursif yaitu jika realisasi fungsi f mengandung fungsi g yang realisasinya adalah aplikasi terhadap f. Realisasi G list‐param: F ekspresi‐1 F list‐param: depend on kondisi‐basis : ekspresi‐1 kondisi‐rekurensi : G ekspresi ‐2 Fungsi merupakan sub program yang sangat bermanfaat dalam pemrograman, terutama untuk program atau proyek yang besar. Manfaat penggunaan subprogram antara lain adalah :  Meningkatkan readibility, yaitu mempermudah pembacaan program  Meningkatkan modularity, yaitu memecah sesuatu yang besar menjadi modul-modul atau bagian- bagian yang lebih kecil sesuai dengan fungsinya, sehingga mempermudah pengecekan, testing dan lokalisasi kesalahan.  Meningkatkan reusability, yaitu suatu sub program dapat dipakai berulang kali dengan hanya memanggil sub program tersebut tanpa menuliskan perintah- perintah yang semestinya diulang- ulang. Sub Program Rekursif adalah subprogram yang memanggil dirinya sendiri selama kondisi pemanggilan dipenuhi. Dengan melihat sifat sub program rekursif di atas maka sub program rekursif harus memiliki :  kondisi yang menyebabkan pemanggilan dirinya berhenti disebut kondisi khusus atau special condition  pemanggilan diri sub program yaitu bila kondisi khusus tidak dipenuhi Secara umum bentuk dari sub program rekursif memiliki statemen kondisional : if kondisi khusus tak dipenuhi then panggil diri ‐sendiri dengan parameter yang sesuai else lakukan instruksi yang akan dieksekusi bila kondisi khusus dipenuhi Sub program rekursif umumnya dipakai untuk permasalahan yang memiliki langkah penyelesaian yang terpola atau langkah-langkah yang teratur. Bila kita memiliki suatu permasalahan dan kita mengetahui algoritma penyelesaiannya, kadang- kadang sub program rekursif menjadi pilihan kita bila memang memungkinkan untuk dipergunakan. Secara algoritmis dari segi algoritma, yaitu bila kita mempertimbangkan penggunaan memori, waktu eksekusi sub program sub program rekursif sering bersifat tidak efisien . Dengan demikian sub program rekursif umumnya memiliki efisiensi dalam penulisan perintah, tetapi kadang tidak efisien secara algoritmis. Meskipun demikian banyak pula permasalahan- permasalahan yang lebih sesuai diselesaikan dengan cara rekursif misalnya dalam pencarian searching. 2008 | Direktorat Pembinaan SMK 357 Untuk dapat memahami proses yang terjadi dalam sebuah fungsi rekursif , perhatikan contoh fungsi rekursif berikut : void rekursi int a, int b { If b== return; a++; b ‐‐; cout Masuk \ n a b; rekursia,b; cout Keluar \ n a b; } Misalkan Fungsi tersebut dipanggil dengan nilai a = 3 dan b = 3 maka pertama tama di cek apakah b = 0 if b == 0 return, jika sama maka keluar. Ternyata nilai b tidak sama dengan 0 maka tambahkan a dengan 1 dan kurangi b dengan 1. Maka keadaan sekarang menjadi a = 4 dan b = 2 . Baris berikutnya menampilkan nilai a dan b ke layar printf cout Masuk \ n a b;. Kemudian panggil fungsi rekursi dengan nilai a = 4 dan b = 2 . Langkah – langkah tersebut diulang terus sampai pemanggilan fungsi rekursi dengan nilai a = 6 dan b = 0. Pada saat ini kondisi if bernilai benar sehingga fungsi akan keluar return dan melanjutkan perintah setelah pemanggilan fungsi rekursi dengan a = 6 dan b = 0. Yaitu mencetak nilai a dan b cout Keluar \n a b;. Setelah mencetak nilai a dan b maka fungsi rekursif akan keluar lagi , dan melanjutkan perintah setelah pemanggilan fungsi rekursif sebelumnya dimana nilai a = 5 dan b = 1 . Demikian seterusnya sampai nilai a = 4 dan nilai b = 2. yang tidak lain pemanggilan fungsi rekurif yang pertama. Proses pemanggilan fungsi rekursif dapat diilustrasikan: Langkah ke: Rekursif 3,3 1 a=4 ; b=2 . Cetak : masuk  a=4 || b=2 1 6 2 a=5 ; b=1 . Cetak : masuk  a=5 || b=1 Rekursif 4,2 3 a=6 ; b=0 . Cetak : masuk  a=6 || b=0 2 5 4 a=6 ; b=0 . Cetak : keluar  a=6 || b=0 Rekursif 5,1 5 a=5 ; b=1 . Cetak : keluar  a=5 || b=1 3 4 6 a=4 ; b=2 . Cetak : keluar  a=4 || b=2 Rekursif 6,0 Gambar 10.1. Proses Pemanggilan Fungsi Rekursif Penggunaan fungsi rekursif misalnya pada fungsi pangkat, faktorial, dan barisan fibonacci. Mari kita lihat satu demi satu. Dalam fungsi pangkat xy , kita tahu bahwa semua bilangan selain 0, jika dipangkatkan dengan 0 nilainya sama dengan 1. Jika x dipangkatkan 358 Direktorat Pembinaan SMK | 2008 dengan y, dengan y lebih dari 0, maka hasilnya sama dengan x dikalikan dengan x dipangkatkan y – 1. Jika dituliskan dalam notasi matematika definisinya adalah sebagai berikut: Kita lihat di atas pada definisi y 0, bentuk pemangkatan muncul kembali di sisi kanan. Itulah yang disebut rekursif. Definisi rekursif selalu dimulai dengan kasus penyetop, penghenti, atau kasus dasar dari suatu permasalahan, dalam hal ini terjadi ketika nilai y = 0. Definisi rekursif yang lebih kompleks mengandung inti dari permasalahan yang akan dipecahkan, namun lebih sederhana. Dalam hal ini yang tadinya x dipangkatkan dengan y, kini bentuk pemangkatan menjadi lebih sederhana, yaitu y – 1. Hal ini dimaksudkan untuk “menggiring” masalah kompleks ke kasus dasar atau penyetop rekursinya. Untuk x = 10 dan y = 0, hasil dari xy adalah 1. Untuk x = 10 dan y = 3 hasilnya dapat digambarkan sebagai berikut: Konsep rekursifitas banyak ditemui di dunia nyata. Istilah ini muncul pertama kali di kajian bidang matematika. Dalam kasus tertentu, konsep ini memudahkan perumusan formula. Konsep ini pun difasilitasi dalam pemrograman. Dalam pemrograman, ada 2 terminologi yang bisa didefinisikan dengan rekursif, yaitu prosedur dan fungsi. Seperti halnya dalam bidang matematika, penggunaan konsep ini juga untuk memudahkan pendefinisian dua terminologi tersebut. Bahkan terdapat suatu masalah yang hanya bisa diselesaikan dengan rekursifitas dan sangat sulit untuk diselesaikan tanpa rekursifitas. Definisi rekursif harus memuat komponen basis dan komponen rekursif. Dalam pemrograman, komponen ini dapat dipisahkan dengan menggunakan perintah analisa kasus. Misalkan e1 adalah ekspresi kondisi untuk basis dan e2 adalah ekspresi kondisi untuk bagian rekursif, definisi rekursif dapat dituliskan: if e1 then {bagian basis} else {bagian rekursif} Salah satu contoh dari kasus rekursif adalah barisan bilangan fibonacci. Barisan bilangan fibonacci adalah 1, 1, 2, 3, 5, 8, 13, 21, ... . Definisi barisan bilangan fibonacci adalah sebagai berikut. Misalkan fibonaccii menyatakan bilangan fibonacci yang ke-i, maka:          2 , 1 , 1 2 , 2 1 i i i fibobacci i fibonacci i fibonacci 2008 | Direktorat Pembinaan SMK 359 Program 10.1. Penerapan bilangan Fibonaci dengan rekursi include iostream includeconio.h using namespace std; int Fibonaciint; int main { int n= 7 ; for int i= 1 ; i=n; i++ cout \ndata Fibonacii; getch; return ; } int Fibonaciint n { if n= 2 return n; else returnFibonacin ‐ 2 +Fibonacin ‐ 1 ; } Keluaran program diatas adalah: data 1 data 2 data 3 data 5 data 8 data 13 data 21 Rekursif adalah suatu method yang memanggil dirinya sendiri secara langsung maupun tidak lansung. Rekursif merupakan teknik pemrograman yang sangat berguna. Dalam beberapa kasus, menggunakan cara rekursi memudahkan pengembangan program secara natural, langsung, dan simple dalam memecahkan problem yang susah dipecahkan. Untuk lebih memahami rekursif perhatikan contoh berikut: Contoh yang umum untuk memahami teknik rekursif adalah masalah factorial. 360 Direktorat Pembinaan SMK | 2008 4 = 4 x 3 x 2 x 1 3 = 3 x 2 x 1 2 = 2 x 1 1 = 1 Dari contoh di atas bisa diubah cara pandangnya menjadi: 4 = 4 x 3 3 = 3 x 2 2 = 2 x 1 1 = 1 Dengan catatan bahwa 0 = 1 maka cara pandang yang kedua bisa dlanjutkan menjadi: 4 = 4 x 3 3 = 3 x 2 2 = 2 x 1 1 = 1 = 1 Cara pandang yang kedua inilah yang disebut rekursif, karena dalam proses perhitungan selalu memanggil dirinya sendiri. Yaitu factorial memanggil factorial. Akan tetapi perlu dicatat bahwa teknik rekursif ini harus ada terminasinya atau ada saat berhentinya. Pada contoh factorial ini adalah 0. Yaitu sama dengan 1 bukan 0. Dalam istilah matematika 0 ini disebut dengan base step. Sedangkan bagian yang lain disebut recursive step. Secara umum rumus factorial dalam bentuk rekursif menjadi sebagai berikut: = 1; base step n = n x n – 1; n 0 recursive step Jadi proses rekursif itu akan selalu memanggil dirinya sendiri dengan variable yang berbeda, dan terus dilakukan sampai mencapai base step sebagai terminasinya. Setelah terminasi maka akan mendapatkan hasil dan selanjutnya hasil tersebut dikembalikan ke pemanggilnya untuk dilakukan perhitungan. Hal itu dilanjutkan sampai ke pemanggil yang pertama sehingga mendapatkan hasil sebagaimana mestinya. Ilustrasi berikut memberi gambaran tentang proses rekursif. 2008 | Direktorat Pembinaan SMK 361 Gambar 10.2. Ilustrasi Tentang Proses Rekursif.

10.2. Pengertian Teknik Iteratif

Teknik Iteratif adalah teknik perulangan atau menghitung secara berulang. Teknik ini memanfaatkan kelebihan komputer sebagai mesin hitung yang mampu melakukan perhitungan secara berulang dengan perintah yang sangat sederhana. Cara ini mudah dilakukan akan tetapi memerlukan proses yang panjang untuk mendapatkan hasil, dan cara ini menggunakan memori langsung. Contoh factorial cara pandang yang pertama menggunakan teknik iteratif 4 = 4 x 3 x 2 x 1 3 = 3 x 2 x 1 2 = 2 x 1 1 = 1 Untuk menghitung n berarti mengkalikan bilangan bulat positif dari 1 sampai dengan n. Pengertian penghitunganannya terlihat mudah, namun jika n bilangan yang besar jika dihitung tanpa komputer akan sangat sulit dan lama. Kebanyakan pemrogram pemula menggunakan cara ini karena lebih jelas algoritmanya.

10.3. Perbandingan Teknik Rekursif dan Teknik Iteratif

Teknik Iteratif lebih mudah dimengerti karena jelas tinggal mengurutkan angka-angkanya dari 1 atau mungkin 0 sampai dengan n. Operasi yang terjadi bisa tambah+, kurang-, bagi, kali, kadangkala juga pangkat atau yang lainnya namun dapat dikembalikan ke empat operasi dasar pertama. Kerugian yang pertama teknik ini 3 4 = 4 x 2 3 = 3 x 1 2 = 2 x 1 = 1 x = 1 1 1 2 6 362 Direktorat Pembinaan SMK | 2008 membutuhkan memori yang banyak terutama untuk bilangan yang besar. Yang kedua proses iterasi bisa membutuhkan waktu yang lama apabila bilangannya besar. Sedang Teknik Rekursif harus tahu formulanya dahulu, dalam hal ini mana base step-nya, dan mana rekursif step-nya. Biasa dipakai oleh pemrogram yang sudah agak lanjut dan operasi matematikanya merupakan operator biasa. Namun memori yang digunakan bukan memori langsung penampung variable namun merupakan stack. Jadi banyak sedikitnya penghitungan tergantung dari besarnya kapasitas stack yang dipunyai komputer. Secara rata-rata proses panghitungan dengan rekursif akan lebih cepat karena kompleksitasnya lebih kecil dibanding dengan iteratif. Kadang seseorang bertanya, loh saya kan juga bisa membuat fungsi pangkat di atas dengan menggunakan teknik iteratif. Misalnya menggunakan while loop. Kenapa harus repot‐repot menggunakan rekursif? Memang benar bahwa semua fungsi rekursif dapat dibuat versi iterasinya. Namun demikian, ada beberapa masalah yang jauh lebih mudah jika dipecahkan dengan rekursif. Kode program untuk beberapa masalah rekursif juga relatif lebih mudah dipahami dibandingkan versi iterasinya. Berikut adalah versi iteratif dari fungsi pangkat. Sekaranng perhatikan pada aplikasi permainan menara Hanoi di bawah ini Menara Hanoi ialah salah satu permainan yang dulunya dimainkan oleh seorang pendeta di Hanoi. Tujuan permainan ini ialah memindahkan n buah pringan dari tonggak asal A melalui tonggak bantu B menuju tonggak tujuan C. Dengan aturan–aturan bahwa piringan yang lebih kecil tidak boleh berada di bawah piringan yang lebih besar. Menara A B C : a b c Gambar 10.3. Menara dengan Tiga Piringan