Rekursi (Recursion)

Download Report

Transcript Rekursi (Recursion)

Rekursi (Recursion)
• Fungsi rekursi adalah fungsi yang didalam function bodynya 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 :
1.
2.
3.
4.
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() {
char A[80];
int n;
Baca(A,&n);
Tulis(A,n);
}
/* Program Utama */
/* Program Tulis_Mundur secara Rekursif */
#include <stdio.h>
void Mundur() {
char ch ;
ch=getche();
if (ch != ‘.’) Mundur();
if (ch != ‘.’) printf(“%c”,ch);
}
void main() {
Mundur();
}
/ *Program Utama */
Mekanisme Pemanggilan Fungsi secara Rekursif sbb:
Main()
{
Mundur();
}
void mundur(){
char ch;
ch=getche();
if(ch != ‘.’)
Mundur();
if(ch != ‘.’)
void mundur(){
char ch;
ch=getche();
if(ch != ‘.’)
Mundur();
if(ch != ‘.’)
void mundur(){
char ch;
ch=getche();
if(ch != ‘.’)
Mundur();
if(ch != ‘.’)
printf(“%c”,ch);
}
printf(“%c”,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 penyelesaian 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)
Fib(4)
Fib(3)
Fib(2)
Fib(1)
Fib(1)
Fib(2)
Fib(1)
Fib(0)
Fib(0)
Menara Hanoi
Masalah : Memindahkan n-piringan dari pilar-kiri ke pilarkanan 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:
Pilar Kiri
Pilar Tengah
Pilar
Kanan
1
2
3
4
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 :
1. Untuk memindahkan n piringan, pikirkan dahulu cara
memindahkan (n-1) piringan.
2. Ulangi langkah 2 untuk (n-1),(n-2),...
3. 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*/
}