Anda di halaman 1dari 11

June 17, 

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: 


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 {

public static int pangkatRekursif(int x, int y) {


if (y == 0) {
return 1;
}
else {
return x * pangkatRekursif(x, y - 1);
}

Wisnu Widiarta – http://wishknew.multiply.com 2
 
June 17, 
KONSEP PEMROGRAMAN ‐ REKURSIF 
2007 
 
}

public static void main(String[] args) {


System.out.println("10 dipangkatkan 3 = " + pangkatRekursif(10, 3));
}


 
Versi  program Pangkat;
Delphi 
{$APPTYPE CONSOLE}

uses SysUtils;

type
TTestPangkat = class(TObject)
class function PangkatRekursif(x, y: integer): integer;
end;

{ TTestPangkat }

class function TTestPangkat.PangkatRekursif(x, y: integer): integer;


begin
if (y = 0) then
Result := 1
else
Result := x * PangkatRekursif(x, y - 1);
end;

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 {

public static int pangkatIteratif(int x, int y) {


int hasil = 1, i = 1;
while (i <= y) {
hasil = hasil * x;
i++;
}
return hasil;
}

public static void main(String[] args) {


System.out.println("10 dipangkatkan 3 = " + pangkatIteratif(10, 3));
}


 
Versi  program Pangkat;
Delphi 
{$APPTYPE CONSOLE}

uses SysUtils;

type
TTestPangkat = class(TObject)
class function PangkatIteratif(x, y: integer): integer;
end;

{ TTestPangkat }

class function TTestPangkat.PangkatIteratif(x, y: integer): integer;


var
i: integer;
begin
i := 1;
Result := 1;
while (i <= y) do
begin
Result := Result * x;
Inc(i);
end;
end;

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: 

Jumlah Perulangan Rekursif  Iteratif 


(detik) (detik)
10 0 0
100 0 0
1.000 0 0
10.000 0 0
100.000 2 0
1.000.000 4 5
10.000.000 5 2
100.000.000 14 4
1.000.000.000 146 42
 

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 {

public static void main(String[] args) {


for (int x=1; x<10; x++) {
System.out.print("(a + b)^" + x + " = ");
cetakDefinisiPangkatAdanB(x);

Wisnu Widiarta – http://wishknew.multiply.com 8
 
June 17, 
KONSEP PEMROGRAMAN ‐ REKURSIF 
2007 
 
}
}

public static int konstanta(int x, int y) {


if (y == 1 || y == x + 1) {
return 1;
}
else {
return konstanta(x - 1, y - 1) + konstanta(x - 1, y);
}
}

private static void cetakDefinisiPangkatAdanB(int x) {


String hasil = "";
int pangkat = x;
for (int i = 1; i <= x + 1; i ++) {
int pangkatA = pangkat - (i - 1);
int pangkatB = x - pangkatA;
if (!hasil.equals("")) {
hasil = hasil + " + ";
}
hasil = hasil + konstanta(x, i) + "a^" + pangkatA + " + b^" +
pangkatB;
}
System.out.println(hasil);
}


 
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 }

class procedure TPemangkatanAdanB.CetakDefinisiPangkatAdanB(x:


integer);
var
hasil: String;
pangkat, i, pangkatA, pangkatB: integer;
begin
hasil := '';
pangkat := x;
for i := 1 to x + 1 do
begin
pangkatA := pangkat - (i - 1);

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;

class function TPemangkatanAdanB.Konstanta(x, y: integer): integer;


begin
if (y = 1) or (y = x + 1) then
Result := 1
else
Result := Konstanta(x - 1, y - 1) + Konstanta(x - 1, y);
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
 

Anda mungkin juga menyukai