Rekursi (Recursion) Fungsi rekursi adalah fungsi yang didalam function body- nya ada statement yang memanggil dirinya sendiri. Fungsi rekursif, sangat berguna dalam pemecahan masalah jika masalah tadi dapat didefinisikan secara rekursif pula. Contoh : Faktorial (n) atau n! didefinisikan sebagai berikut : n! = 1, untuk n = 0; n! = n * (n-1)!, untuk n > 0 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1* 0! 0! = 1 Bila ditelusur mundur : 4! = 1*2*3*4 = 24
Iteratif vs Rekursif: Contoh persoalan : Masukan : ARABIKA. Keluaran : AKIBARA Algoritma dengan cara iteratif : Masukan huruf dari keyboard. Simpan huruf pada struktur array. Ulangi 1 dan 2, hingga kata/kalimat selesai. Ambil huruf dari array, dengan urutan terbalik, yaitu dari indeks terbesar ke indeks terkecil. 5. Tampilkan huruf di layar monitor. 6. Ulangi 4 dan 5, hingga semua huruf ditampilkan.
/* Program Tulis_Mundur secara Iteratif */ #include <stdio.h> void Baca(char *ptr, int *Y) { int k=0; char ch; ch = getche(); while(ch != ‘.’) { /*‘.’ tanda akhir kata */ ptr[k]=ch; k++; ch=getche(); } k--; *Y=k; void Tulis(char *ptr, int n) int i; for (i=n; i>=0; i--) printf(“%c”,ptr[i]); printf(“\n”);
void main() { /* Program Utama */ char A[80]; int n; Baca(A,&n); Tulis(A,n); } /* Program Tulis_Mundur secara Rekursif */ #include <stdio.h> void Mundur() { char ch ; ch=getche(); if (ch != ‘.’) Mundur(); if (ch != ‘.’) printf(“%c”,ch); void main() { / *Program Utama */ Mundur();
Mekanisme Pemanggilan Fungsi secara Rekursif sbb: Main() { Mundur(); } void mundur(){ char ch; ch=getche(); if(ch != ‘.’) Mundur(); if(ch != ‘.’) printf(“%c”,ch); } void mundur(){ char ch; ch=getche(); if(ch != ‘.’) Mundur(); if(ch != ‘.’) printf(“%c”,ch); } void mundur(){ char ch; ch=getche(); if(ch != ‘.’) Mundur(); if(ch != ‘.’) printf(“%c”,ch); } Meskipun penulisan program dengan cara rekursif bisa lebih pendek, namun procedure atau function rekursif memerlukan : Memori yang lebih banyak, karena perlu tambahan untuk ‘Activation Record Stack’. Waktu lebih lama, karena perlu menjejaki setiap pemanggilan rekursif melalui ‘Activation Record’. Secara umum, gunakan penyelesaian secara rekursif, hanya jika : Penyelesaian sulit dilaksanakan secara iteratif
Efisiensi dengan cara rekursif sudah memadai Efisiensi bukan masalah dibandingkan dengan kejelasan logika program Pemborosan (Redundancy) dapat terjadi dalam penyele- saian masalah secara rekursif. Contoh klasik : Bilangan Fibonacci : Fib(n) = n, bila n = 0 atau n = 1 Fib(n) = Fib(n-2) +Fib(n-1), bila n 2 int Fib(int n) { int k; if (n == 0) k= 0; else if (n == 1) k=1; else k=Fib(n-2) + Fib(n-1); return(k); }
Skema Pemanggilan Fib(4) Menara Hanoi Masalah : Memindahkan n-piringan dari pilar-kiri ke pilar-kanan dengan pilar-tengah sebagai antara. Piringan yang berada dipilar kiri tersusun sedemikian rupa sehingga menyerupai menara, yaitu piringan yang lebih kecil selalu berada diatas piringan yang lebih besar. Pada proses pemindahan piringan-piringan tersebut, pola susunan menara harus selalu dijaga.
Ilustrasi Menara Hanoi: 1 2 3 4 Pilar Kiri Pilar Kanan Tengah Algoritma dengan teknik Working-Backward : 1. Pindahkan (n-1) piringan-piringan atas ke pilar antara. 2. Pindahkan piringan terakhir ke pilar tujuan 3. Ulangi 2 dan 3, hingga selesai.
Disebut teknik Working-Backward, karena berjalan mundur dahulu, yaitu : Untuk memindahkan n piringan, pikirkan dahulu cara memindahkan (n-1) piringan. Ulangi langkah 2 untuk (n-1),(n-2),... Pindahkan 1 piringan, yaitu piringan terakhir. Dalam pemecahan Menara Hanoi ini, tersirat pemecahan dengan teknik Sub-Goal ! Contoh penggunaan Cara Rekursif pada masalah Menara Hanoi.
Menara (int N, char Awal, char Akhir, char Antara) { If (N==1) printf (“Pindahkan 1 dari : %c ke %c\n”,Awal,Akhir); else { Menara (N-1,Awal,Antara,Akhir); printf (”Pindahkan %d dari %c ke %c\n”, N, Awal, Akhir); Menara(N-1, Antara, Akhir, Awal); } void main() int N; printf (”Banyak Piringan ? ”); scanf(“%d”,&N); Menara(N,’L’,’R’,’M’); /*Left, Right, Middle*/