Anda di halaman 1dari 14

PRAKTIKUM 2

Rekursif dan Searching

A. TUJUAN
Setelah melakukan praktikum bab ini, mahasiswa diharapakan mampu :
1. Memahami konsep-konsep Rekursif dan algoritma searching
2. Mengimplementasikan penggunaan rekursif dan algoritma searching untuk
menyelesaikan sebuah studi kasus.

B. DASAR TEORI
B1. SEARCHING
Algoritma pencarian adalah algoritma yang menerima argumen/ parameter a dan
kemudian mencoba untuk menemukan sebuah record yang key-nya adalah a di dalam
sebuah tabel/ himpunan data. Bentuk algoritma pencarian yang paling sederhana adalah
sequential search/ pencarian berurutan. Algoritma ini mampu diterapkan pada
sebuah tabel data baik yang berupa sebuah array ataupun linked list. Misal, k adalah
sebuah array dengan n elemen/ keys, k(0) sampai dengan k(n – 1). Sedangkan key adalah
argumen/ parameter pencariannya. Maka algoritmanya adalah:
for ( i = 0; i < n; i++ )
if ( key == k(i) )
return(i);
return(-1);

Misal akan dicari data angka 79. Maka proses pencariannya adalah seperti di bawah ini:

Gambar 2.1 Algoritma Sequensial

Algoritma tersebut akan melakukan pengecekan untuk setiap key secara bergiliran
sampai ditemukannya kecocokan dengan argumen. Indeks key yang cocok akan
dikembalikan oleh fungsi. Tetapi jika tidak ditemukan kecocokan maka nilai –1 akan
dikembalikan oleh fungsi.
Contoh dengan Java:
public class Searching

public static void main(String[] args)

int [] myArray = {21,52,6,1,32,76,32};

for(int i=0;i<myArray.length;i++)

if(myArray[i]==76)

System.out.println("Data ditemukan!!");

Selain Sequential Search juga ada Binary search. Salah satu syarat pencarian biner
(binary search) dapat dilakukan adalah data sudah dalam keadaan terurut. Dengan kata
lain, apabila data belum dalam keadaan terurut , pencarian biner tidak dapat dilakukan .
Dalam kehidupan sehari-hari, sebenarnya kita juga sering menggunakan pencarian biner.
Misalnya saat kita ingin mencari suatu kata dalam kamus.
Pencarian Biner (Binary Search) dilakukan untuk :
1. Memperkecil jumlah operasi pembandingan yang harus dilakukan antara data
yang dicari dengan data yang ada di dalam tabel, khususnya untuk jumlah data
yang sangat besar ukurannya.
2. Prinsip dasarnya adalah melakukan proses pembagian ruang pencarian secara
berulang-ulang sampai data ditemukan atau sampai ruang pencarian tidak dapat
dibagi lagi (berarti ada kemungkinan data tidak ditemukan).
3. Syarat utama untuk pencarian biner adalah data di dalam tabel harus sudah
terurut, misalkan terurut menaik.

POLITEKNIK KEDIRI 2
Untuk lebih jelasnya, perhatikan contoh berikut. Misalkan kita ingin mencari 17 pada
sekumpulan data berikut :

1. Mula–mula dicari data tengah, dengan rumus (1+ 9) / 2 = 5.


2. Berarti data tengah adalah data ke-5, yaitu 15.
3. Data yang dicari, yaitu 17, dibandingkan dengan data tengah ini.
4. Karena 17 > 15, berarti proses dilanjutkan tetapi kali ini posisi awal dianggap
sama dengan posisi tengah + 1 atau 6.

POLITEKNIK KEDIRI 3
5. Data tengah yang baru didapat dengan rumus (6 + 9) / 2 = 7. Berarti data tengah
yang baru adalah data ke-7, yaitu 23.
6. Data yang dicari, yaitu 17 dibandingkan dengan data tengah ini.
7. Karena 17 < 23, berarti proses dilanjutkan tetapi kali ini posisi akhir dianggap
sama dengan posisi tengah – 1 atau 6.

8. Data tengah yang baru didapat dengan rumus (6 + 6) / 2 = 6. Berarti data tengah
yang baru adalah data ke-6, yaitu 17.
9. Data yang dicari dibandingkan dengan data tengah ini dan ternyata sama. Jadi
data ditemukan pada indeks ke-6.
10. Bagaimana jika data yang dicari tidak ada, misalnya 16?
Pencarian biner ini akan berakhir jika data ditemukan atau posisi awal lebih besar
dari posisi akhir.Jika posisi awal sudah lebih besar daripada posisi akhir berarti
data tidak ditemukan.

Untuk lebih jelasnya perhatikan proses pencarian 16 pada data di atas. Prosesnya hampir
sama dengan pencarian 17. Tetapi setelah posisi awal = posisi akhir = 6, proses masih
dilanjutkan lagi dengan posisi awal = 6 dan posisi akhir = 5

Disini dapat dilihat bahwa posisi awal lebih besar daripada posisi akhir, yang artinya data
tidak ditemukan.

POLITEKNIK KEDIRI 4
B2. REKURSIF
B2.1 DEFINISI REKURSIF
Rekursif adalah kemampuan yang dimiliki suatu fungsi untuk memanggil dirinya
sendiri. Rekursi dapat dilakukan secara langsung atau tidak langsung. Pseudocode 2.1
berikut ini merupakan pseudocode untuk rekursi langsung. Sedangkan Pseudocode 2.2
berikut ini merupakan pseudocode untuk langsung. Namun pada bab ini hanya akan
dibahas rekursi langsung.
Pseudocode 2.1

Recurse (parameter){


Recurse (parameter);

}

Pseudocode 2.2

Recurse1 (parameter){

Recurse2 (parameter);

}
Recurse2 (parameter){

Recurse1 (parameter);

}

B2.2 REKURSIF UNTUK MENCARI FAKTORIAL


Dalam matematika, faktorial dari bilangan asli n adalah hasil perkalian antara
bilangan bulat positif yang kurang dari atau sama dengan n. Faktorial ditulis sebagai n!
dan disebut n faktorial. Secara umum dapat dituliskan sebagai:
𝑛! = 𝑛. (𝑛 − 1). (𝑛 − 2) … 3.2.1
Dengan formula demikian, maka contoh mencari nilai factorial untuk n = 0,1,2,3
dapat ditulis sebagai berikut.
o 0! = 1
o 1! = 1
o 2! = 2 x 1
o 3! = 3 x 2 x 1

POLITEKNIK KEDIRI 5
Dalam pemrograman, mencari nilai factorial merupakan contoh fungsi rekursif.
Nilai sebuah faktorial n dapat ditulis menggunakan persamaan berikut:

𝑛 ∗ 𝑓𝑎𝑘𝑡𝑜𝑟𝑖𝑎𝑙(𝑛 − 1) ,𝑛 > 1
𝑓𝑎𝑘𝑡𝑜𝑟𝑖𝑎𝑙(𝑛) = { 𝑓𝑎𝑘𝑡𝑜𝑟𝑖𝑎𝑙(1) = 1 ,𝑛 = 1
𝑓𝑎𝑘𝑡𝑜𝑟𝑖𝑎𝑙(0) = 1 ,𝑛 = 0

Perhitungan rekursif ini dapat digambarkan sebagai:

Gambar 2. 1 Gambaran fungsi rekursif

Berikut ini merupakan pseudocode fungsi rekursif untuk menghitung nilai


faktorial. Pseudocode 2.3 berikut ini merupakan method fungsi rekursif dengan
parameter n. Selanjutnya Pseudocode 2.4 merupakan kelas main untuk memanggil fungsi
rekursif.
Pseudocode 2.3

Start
Input n
If n = 0 or n = 1
Return 1
Else
Return n*factorial(n-1)
End If
End

Pseudocode 2.4

Start
Input n
Calculate fact=factorial(n)
Print fact
End

POLITEKNIK KEDIRI 6
B2.2 REKURSIF UNTUK MENCARI PALINDROME
Palindrom adalah sebuah kata, frasa, angka maupun susunan lainnya yang dapat
dibaca dengan sama baik dari depan maupun belakang (spasi antara huruf-huruf
biasanya diperbolehkan). Berikut ini merupakan contoh kasus palindrom:
o 5432345
o 09877890
o LEVEL
o KODOK
Berikut ini merupakan contoh pseudocode fungsi rekursif untuk menghitung
palindrom. Pseudocode 2.5 berikut ini merupakan method fungsi rekursif dengan
parameter kata yang akan dideteksi apakah palindrom atau bukan. Selanjutnya
Pseudocode 2.6 merupakan kelas main untuk memanggil fungsi rekursif.
Pseudocode 2.5

Start
Input s
If s.length<=1
Return true
Else if s(0) != s(n-1)
Return false
Else
Return palindrome(s(1,n-2))
End If
End

Pseudocode 2.6

Start
Input s
Boolean pali=palindrome(s)
End

B2.3 REKURSIF UNTUK MENCARI FAKTOR PERSEKUTUAN TERBASAR

Dalam matematika, Faktor Persekutuan Terbesar (FPB) dari dua bilangan


adalah bilangan bulat positif terbesar yang dapat membagi habis kedua bilangan itu.
Menentukan Faktor Persekutuan Terbesar (FPB) dari dua bilangan dapat dilakukan

POLITEKNIK KEDIRI 7
menggunakan rekursif maupun non rekursif. Suatu contoh untuk mencari nilai FPB dari
18 dan 8 tanpa menggunakan fungsi rekursif adalah sebagai berikut

Algoritma menghitung FPB(18,8):

Langkah 1. 18/8 = 2 sisa 2


Langkah 2. 8/2=4 sisa 0
Langkah 3. Faktor terbesar adalah 2.
Algoritma menentukan FPB tanpa rekursif tersebut dapat ditulis dengan Pseudocode
2.7 sebagai berikut:
Pseudocode 2.7

Start
Input bil1, bil2
Initialize sisa = bil1 mod bil2
While sisa != 0
bil1 = bil2
bil2 = sisa
sisa = bil1 mod bil2
End While
Print fpb=bil2
End

Selanjutnya algoritma pada Pseudocode 2.7 tersebut diterjemahkan dalam Source


code 2.3 berikut ini:

Source Code 2.3

public static int FPBnonRec(int bil1, int bil2) {


if(bil2>bil1){
int temp=bil1;
bil1=bil2;
bil2=temp;
}
int sisa=bil1%bil2;
while(sisa != 0){
bil1=bil2;
bil2=sisa;
sisa=bil1%bil2;
}
return bil2;
}

public static void main(String[] args) {

POLITEKNIK KEDIRI 8
// TODO code application logic here
System.out.println("FPB dari 6 dan 4 adalah
"+FPBnonRec(6,4));
System.out.println("FPB dari 4 dan 6 adalah
"+FPBnonRec(4,6));
}

Sedangkan algoritma menentukan FPB dengan menggunakan fungsi rekursif tersebut


dapat ditulis dengan Pseudocode 2.7. Selanjutnya fungsi rekursif dipanggil dalam kelas
main.
Pseudocode 2.8

Start
Input bil1, bil2
If bil1 = 0
Return bil2
Else if bil1<bil2
Return CariFPB(bil2,bil1)
Else
Return CariFPB(bil1%bil2,bil2)
End If
End

Selanjutnya algoritma pada Pseudocode 2.8 tersebut diterjemahkan dalam Source


code 2.4 berikut ini:

Source Code 2.4

public static int FPBRec (int bil1,int bil2) {


if (bil2==0){
return bil2;
}else if (bil1<bil2){
return FPBRec (bil2,bil1);
}else{
return FPBRec (bil1%bil2,bil2);
}

public static void main(String[] args) {


// TODO code application logic here
System.out.println("FPB dari 6 dan 4 adalah
"+FPBRec(6,4));

POLITEKNIK KEDIRI 9
System.out.println("FPB dari 4 dan 6 adalah
"+FPBRec(4,6));
}

Selanjutnya jika sourcecode tersebut dieksekusi maka akan tampil seperti pada
Gambar 2.4 berikut ini:

Gambar 2.2 Hasil Output Sourcecode 2.4

B2.4 REKURSIF UNTUK MENCARI FIBONACCI

Contoh fungsi rekursif selanjutya adalah mencari bilangan Fibonacci. Bilangan


fibonacci n didefinisikan sebagai penjumlahan dua suku sebelumnya. Bilangan fibonacci
ditentukan dengan persamaan sebagai berikut:
𝑓𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖(𝑛 − 1) + 𝑓𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖(𝑛 − 2) ,𝑛 > 1
𝑓𝑖𝑏𝑜𝑛𝑎𝑐𝑐𝑖(𝑛) = { 1 ,𝑛 = 1
0 ,𝑛 = 0

Berdasarkan persamaan diatas, maka Barisan Fibonacci dapat dinyatakan sebagai


berikut: 0, 1, 1, 2, 3, 5, 8, 13, 21, …
Algoritma untuk memperoleh bilangan Fibonacci tersebut dapat ditulis dengan
Pseudocode 2.9 sebagai berikut:
Pseudocode 2.9
Start
Input n
If n = 0
Return 1
Else If n = 1
Return 1
Else
Return fibonacci(n-1)+fibonacci(n-2)
End If
End

POLITEKNIK KEDIRI 10
C. TUGAS PENDAHULUAN
1. Kenapa diperlukan fungsi searching?
2. Ada berapa jenis algoritma searching yang anda tahu?
3. Apa fungsi rekursif?

D. PERALATAN DAN KOMPONEN


1. Komputer /Laptop sebagai hardware
2. Netbeans sebagai editor source code

E. LANGKAH PRAKTIKUM
E.1 SEARCHING
1. Buatlah kelas bernama Binary_Search kemudian ketikkan souce code dibawah ini.
import java.util.Scanner;

public class Binary_Search


{
public static void main(String[] Args)
{
int k, angka;
System.out.println("Program Binary Search");
System.out.println();
System.out.println("Kumpulan data Array of Random");
boolean notfound=true;
int[] intarray =
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49
,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72
,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95
,96,97,98,99,100};

for(int i=0;i<intarray.length;i++) {
System.out.print(intarray[i]+" ");
}
Scanner sc=new Scanner(System.in);
System.out.print("\nMasukan angka yang ingin dicari = ");
angka=sc.nextInt();

int batasAtas=intarray.length-1;
int batasBawah=0;

while (notfound)
{
int posisiSekarang = (batasAtas + batasBawah)/2;
if(intarray[posisiSekarang] == angka)
{
notfound=false;
System.out.println("Angka "+angka+" ditemukan" );

POLITEKNIK KEDIRI 11
}
else if(batasBawah>batasAtas)
{
System.out.println("Angka " +angka+" tidak ditemukan");
break;
}
else
{
if(intarray[posisiSekarang]< angka)
{
batasBawah = posisiSekarang+1;
}
else
{
batasAtas = posisiSekarang-1;
}
}
}
}
}
2. Jalankan source code tersebut dan analisa fungsi setiap baris kodenya.
3. Manipulasi program diatas dengan menambahkan output berupa letak angka
yang dicari.

E.2 PERHITUNGAN KOMPLEKSITAS ALGORITMA


1. Buatlah sebuah kelas bernama “Bil_Faktorial” Kemudian tuliskan source code
berikut:
Source Code 2.1

public static long fakt (int n){


if (n==0 || n==1){
return 1;
}else{
return (fakt(n-1)*n);
}

public static void main(String[] args) {


// TODO code application logic here

Scanner masukan = new Scanner(System.in);


System.out.print("Masukkan n = ");
int n= masukan.nextInt();

System.out.println("Nilai dari "+n+"!"+" = "+fakt(n));


}

2. Jalankan sourcecode tersebut maka akan tampil seperti pada Gambar 2.2 berikut
ini:

POLITEKNIK KEDIRI 12
Gambar 2.3 Hasil Output Sourcecode 2.1

3. Selanjutnya buatlah kelas bernama “Palindrom” untuk mengimplementasikan


Pseudocode 2.5 dan Pseudocode 2.6:

Source Code 2.2

public static boolean palindrom (String s){


if (s.length()<=1){
return true;
}else if (s.charAt(0)!=s.charAt(s.length()-1)){
return false;
}else{
return (palindrom(s.substring(1,s.length()-1)));
}
}

public static void main(String[] args) {


// TODO code application logic here
String x="tomat";
System.out.println("Kata "+x+" merupakan palindrom?");
System.out.println(palindrom(x));
}

4. Jalankan sourcecode tersebut maka akan tampil seperti pada Gambar 2.3 berikut
ini:

Gambar 2. 4 Hasil Output Sourcecode 2.2

F. TUGAS
1. Praktekkan keseluruhan uji coba pada langkah praktikum.
2. Buatlah program dan perhitungan manual untuk mensimulasikan proses
searching pada sebuah deretan angka dengan menggunakan algoritma Binary
Search.

POLITEKNIK KEDIRI 13
G. PENUTUP
Pastikan hal-hal berikut sebelum Anda keluar dari laboratorium :
1. Meja dan kursi tertata kembali dalam keadaan rapi.
2. Komputer dan Monitor dalam keadaan mati.
3. Peralatan dan komponen dikembaikan ke tempat asalnya.
4. Laboratorium dalam keadaan bersih dan rapi.
5. Jangan meninggalkan barang pribadi di laboratorium

G. REFERENSI
Wibowo, Nur Cahyo., Ridwandono, Doddy., Modul Praktikum Struktur Data:
Surabaya,2016.
https://tirago4.wordpress.com/2016/10/11/pencarian-searching-didalam-
algoritma/
https://situsbersamablog.wordpress.com/2016/10/25/notasi-asimtotik-big-oh-
omega-theta-sebuah-algoritma-perulangan-bilangan-genap/

POLITEKNIK KEDIRI 14

Anda mungkin juga menyukai