KONSEP PEMROGRAMAN ‐ REKURSIF
2007
Rekursif
Definisi
Rekursif adalah salah satu metode dalam dunia matematika dimana definisi sebuah fungsi mengandung
fungsi itu sendiri. Dalam dunia pemrograman, rekursi diimplementasikan dalam sebuah fungsi yang
memanggil dirinya sendiri. Istilahnya Joshua, “jeruk kok minum jeruk?”.
Contoh fungsi rekursif misalnya adalah 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 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:
1, 0
, 0
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:
v
103 = 10 * 102 103 = 10 * 100 = 1000
102 = 10 * 101 102 = 10 * 10 = 100
101 = 10 * 100 101 = 10 * 1 = 10
100 = 1
Ide dasar dalam memecahkan suatu masalah dengan rekursif adalah sebagai berikut:
Wisnu Widiarta – http://wishknew.multiply.com 1
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
1. Tentukan kasus penyetop atau kasus dasar di mana pemanggilan rekursif tidak lagi diperlukan
(karena solusinya sudah diperoleh)
2. Terapkan suatu langkah untuk menggiring kasus kompleks ke kasus penyetopnya dengan
metode yang mencerminkan fungsinya
Mari kita lihat contoh rekursif yang jauh lebih sederhana dan lebih mengenyangkan. Masalah yang akan
dipecahkan adalah memotong roti tawar tipis‐tipis sampai habis. Jika masalah ini akan dipecahkan
secara rekursif, maka solusinya adalah:
1. Jika roti sudah habis atau potongannya sudah paling tipis, pemotongan roti selesai
2. Jika roti masih bisa dipotong, potong tipis dari tepi roti tersebut, lalu lakukan prosedur 1 dan 2
untuk sisa potongannya.
Yupe, “semudah” itulah fungsi rekursif! ☺
Ok, mari kita lihat bentuknya dalam pemrograman:
Versi /*
* Main.java
Java *
* Created on June 17, 2007, 6:28 PM
*
*/
package pangkat;
/**
*
* @author Wisnu Widiarta
*/
public class Main {
Wisnu Widiarta – http://wishknew.multiply.com 2
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
}
}
Versi program Pangkat;
Delphi
{$APPTYPE CONSOLE}
uses SysUtils;
type
TTestPangkat = class(TObject)
class function PangkatRekursif(x, y: integer): integer;
end;
{ TTestPangkat }
begin
writeln('10 dipangkatkan 3 = ' +
Format('%d', [TTestPangkat.PangkatRekursif(10, 3)]));
end.
Hasilnya adalah sebagai berikut:
10 dipangkatkan 3 = 1000
Rekursif vs Iterasi
Jika Anda bertanya, loh saya kan juga bisa membuat fungsi pangkat di atas dengan menggunakan iterasi.
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:
Versi /*
* Main.java
Java *
* Created on June 17, 2007, 6:28 PM
*
Wisnu Widiarta – http://wishknew.multiply.com 3
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
*/
package pangkat;
/**
*
* @author Wisnu Widiarta
*/
public class Main {
}
Versi program Pangkat;
Delphi
{$APPTYPE CONSOLE}
uses SysUtils;
type
TTestPangkat = class(TObject)
class function PangkatIteratif(x, y: integer): integer;
end;
{ TTestPangkat }
begin
writeln('10 dipangkatkan 3 = ' +
Format('%d', [TTestPangkat.PangkatIteratif(10, 3)]));
end.
Wisnu Widiarta – http://wishknew.multiply.com 4
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
Hasilnya adalah sebagai berikut:
10 dipangkatkan 3 = 1000
Berikut adalah perbandingan keuntungan dan kelebihan fungsi rekursif vs iteratif:
Rekursif Iteratif
Kode program biasanya lebih ringkas dan mudah Kode program lebih panjang, untuk beberapa
dipahami kasus solusi iteratif lebih sulit diterapkan
Membutuhkan alokasi memori yang besar Relatif lebih kecil alokasi memorinya
Tidak cocok ketika kinerja tinggi diperlukan, karena Cocok diterapkan ketika kinerja aplikasi harus
terjadi overhead pemanggilan fungsi dalam jumlah diterapkan (hanya ada satu kali pemanggilan
yang relatif besar fungsi)
Dengan pengujian 10 pangkat 10 dalam jumlah perulangan yang berbeda‐beda, hasilnya adalah sebagai
berikut:
Wisnu Widiarta – http://wishknew.multiply.com 5
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
Wisnu Widiarta – http://wishknew.multiply.com 6
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
Berikut ini adalah sebuah contoh penerapan rekursif untuk memecahkan masalah matematika
pemangkatan (a + b) dengan n bilangan bulat dengan bantuan segitiga pascal untuk menentukan
konstantanya sehingga menghasilkan bentuk distribusinya terhadap penjumlahan.
Soal Solusi
(a + b)1 a + b
(a + b)2 a2 + 2ab + b2
(a + b)3 a3 + 3ab2 + 3a2b + b3
(a + b)4 a4 + 4ab3 + 6a2b2 + 4a3b1 + b4
Mari kita perhatikan pola segitiga pascal dan kesamaannya dengan konstanta dari solusi di atas:
Pangkat Konstanta dari segitiga Pascal
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
Konstanta
Jika diperhatikan, konstanta paling kiri dan paling kanan adalah 1. Sisanya merupakan penjumlahan dari
konstanta di atasnya. Angka 2 pada pangkat 2 didapatkan dari 1 + 1, angka 3 pada pangkat 3 diperoleh
dari 1 + 2 dan 2 + 1, dan angka 4, 6, dan 4 pada pangkat 4 diperoleh dari 1 + 3, 3 + 3, dan 3 + 1.
Kita akan pecahkan konstanta ini dengan metode rekursif.
Pangkat Konstanta
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
Jika kita perhatikan, tabel di atas membentuk pola barisan bilangan.
Pangkat Barisan
1 Angka ke‐1 = 1, angka ke‐2 = 1
2 Angka ke‐1 = 1, angka ke‐2 = 2, angka ke‐3 = 1
3 Angka ke‐1 = 1, angka ke‐2 = 3, angka ke‐3 = 3, angka ke‐4 = 1
4 Angka ke‐1 = 1, angka ke‐2 = 4, angka ke‐3 = 6, angka ke‐4 = 4, angka ke‐5 = 1
Wisnu Widiarta – http://wishknew.multiply.com 7
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
Pada pangkat(1), angka(1) = 1 dan angka(2) = 1
Pada pangkat(2), angka(1) = 1, angka(2) = 2, dan angka(3) = 1
Kita bisa bentuk suatu persamaan berikut: U(x, y) sebagai angka ke‐y suatu barisan dari pangkat ke‐x.
Jika kita lihat pada tabel di atas, U(2,2) = 2, U(4,3) = 6, dan seterusnya.
Pola rekursifnya adalah sebagai berikut:
, 1
, 1
, , ,
Pangkat
Kita telah memecahkan masalah untuk konstantanya. Sekarang bagaimana dengan pangkatnya? Kita
lihat dari tabel soal dan solusi di atas, pada pemangkatan 1, a ditambahkan dengan b. Namun pada
pemangkatan selanjutnya muncul pola a dikalikan b dengan pemangkatan yang berbeda‐beda. Kita
perlu melihat bagaimana solusi dapat dibuat satu macam pola, sehingga mudah diprogramkan. Berikut
ini kita bentuk ulang solusi tanpa mengubah hasilnya.
Soal Solusi
(a + b)1 1a1b0 + 1a0b1
(a + b)2 1a2b0 + 2a1b1 + 1a0b2
(a + b)3 1a3b0 + 3a2b1 + 3a1b2 + 1a0b3
(a + b)4 1a4b0 + 4a3b1 + 6a2b2 + 4a1b3 + 1a0b4
Okay, sekarang tahap analisis untuk membentuk algoritmanya telah selesai. Kini kita lihat kode
programnya:
Versi /*
* Main.java
Java *
* Created on June 17, 2007, 9:13 PM
*
*/
package pemangkatanadanb;
/**
*
* @author Wisnu Widiarta
*/
public class Main {
Wisnu Widiarta – http://wishknew.multiply.com 8
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
}
}
}
Versi program PemangkatanAdanB;
Delphi
{$APPTYPE CONSOLE}
uses
SysUtils, Variants;
type
TPemangkatanAdanB = class(TObject)
private
class function Konstanta(x, y: integer): integer;
public
class procedure CetakDefinisiPangkatAdanB(x: integer);
end;
var
x: integer;
{ TPemangkatanAdanB }
Wisnu Widiarta – http://wishknew.multiply.com 9
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
pangkatB := x - pangkatA;
if (hasil <> '') then
hasil := hasil + ' + ';
hasil := hasil + VarToStr(konstanta(x, i)) + 'a^' +
VarToStr(pangkatA) +
' + b^' + VarToStr(pangkatB);
end;
writeln(hasil);
end;
begin
for x := 1 to 9 do
begin
write('(a + b)^', x, ' = ');
TPemangkatanAdanB.CetakDefinisiPangkatAdanB(x);
end;
readln;
end.
Hasilnya adalah sebagai berikut:
(a + b)^1 = 1a^1 + b^0 + 1a^0 + b^1
(a + b)^2 = 1a^2 + b^0 + 2a^1 + b^1 + 1a^0 + b^2
(a + b)^3 = 1a^3 + b^0 + 3a^2 + b^1 + 3a^1 + b^2 + 1a^0 + b^3
(a + b)^4 = 1a^4 + b^0 + 4a^3 + b^1 + 6a^2 + b^2 + 4a^1 + b^3 + 1a^0 + b^4
(a + b)^5 = 1a^5 + b^0 + 5a^4 + b^1 + 10a^3 + b^2 + 10a^2 + b^3 + 5a^1 + b^4 + 1a^0 + b^5
(a + b)^6 = 1a^6 + b^0 + 6a^5 + b^1 + 15a^4 + b^2 + 20a^3 + b^3 + 15a^2 + b^4 + 6a^1 + b^5 + 1a^0 + b^6
(a + b)^7 = 1a^7 + b^0 + 7a^6 + b^1 + 21a^5 + b^2 + 35a^4 + b^3 + 35a^3 + b^4 + 21a^2 + b^5 + 7a^1 + b^6 + 1a^0 + b^7
(a + b)^8 = 1a^8 + b^0 + 8a^7 + b^1 + 28a^6 + b^2 + 56a^5 + b^3 + 70a^4 + b^4 + 56a^3 + b^5 + 28a^2 + b^6 + 8a^1 + b^7 + 1a^0 + b^8
(a + b)^9 = 1a^9 + b^0 + 9a^8 + b^1 + 36a^7 + b^2 + 84a^6 + b^3 + 126a^5 + b^4 + 126a^4 + b^5 + 84a^3 + b^6 + 36a^2 + b^7 + 9a^1 + b^8 +
1a^0 + b^9
Kesimpulan
Rekursif merupakan salah satu teknik yang perlu Anda kuasai dalam dunia pemrograman. Sering kali,
masalah yang sangat kompleks, terutama di bidang Artificial Intelligence atau Kecerdasan Buatan, cara
Wisnu Widiarta – http://wishknew.multiply.com 10
June 17,
KONSEP PEMROGRAMAN ‐ REKURSIF
2007
rekursif lebih mudah diterapkan untuk memecahkan suatu masalah dibandingkan teknik iteratif. Namun
demikian, Anda telah melihat sendiri bahwa ada masalah‐masalah tertentu dimana rekursif
menyebabkan kinerja aplikasi Anda sangat terbebani. Lakukan analisis secara mendalam pada masalah
yang akan dipecahkan, dan tentukan metode yang akan diterapkan.
Selamat berekursif!
Wisnu Widiarta – http://wishknew.multiply.com 11