Anda di halaman 1dari 5

PRODI INFORMATIKA

UNIVERSITAS SANATA DHARMA

PRAKTIKUM STRUKTUR DATA LINEAR

MODUL II
Rekursif

A. Tujuan Praktikum
1. Memahami konsep dan cara kerja rekursif
2. Mahasiswa memahami langkah-langkah implementasi rekursif
3. Mahasiswa memahami cara implementasi rekursif
4. Mampu memecahkan permasalahan dengan konsep rekursif

B. Dasar Teori
Rekursif adalah suatu proses atau prosedur dari fungsi yang memanggil dirinya sendiri secara
berulang-ulang. Dikarenakan proses dalam Rekursif terjadi secara berulang-ulang maka harus terdapat
kondisi yang membatasi pengulangan persebut (mengkakhiri pemanggilan tersebut), jika tidak maka
proses tidak akan pernah berhenti. Jika ini terjadi maka memori yang digunakan untuk menampung proses
tersebut tidak dapat menampung lagi/penuh.
Semua kasus menggunakan rekursif dapat dikerjakan tanpa menggunakan rekursif. Kekurangan
Fungsi Rekursif adalah memakan memori lebih besar, karena setiap bagian dari dirinya dipanggil, akan
membutuhkan sejumlah ruang memori untuk penyimpanan. Rekursif sering kali tidak bisa berhenti
sehingga terjadi pemborosan memori dan program tidak akan berhenti dieksekusi. Sehingga rekursif
menjadi “mahal". Karena kita akan memerlukan ruang activation dalam stack, dan juga memerlukan biaya
tambahan untuk pemanggilan method.
Lalu mengapa rekursif tetap dikerjakan? Dalam banyak kasus, biaya ekstra tersebut terbayar dengan
algoritma yang lebih sederhana dan lebih jelas, sehingga membawa pada implementasi pengkodean yang
lebih sederhana. Kelebihan Fungsi Rekursif adalah program menjadi lebih singkat. Pada beberapa kasus,
lebih mudah menggunakan fungsi rekursif, contohnya: pangkat, factorial, dan fibonacci, dan beberapa
proses deret lainnya. Fungsi rekursif lebih efisien dan cepat dibandingkan proses secara iteratif.
Contoh penerapan Rekursif :
1. Faktorial dari bilangan bulat positif 𝑛 didefinisikan sebagai berikut.

𝑛! = 1, dimana 𝑛 = 0, 1 (1)
𝑛! = 𝑛 ∗ (𝑛 − 1)! , dimana 𝑛 > 1 (2)
Jika dibuat dalam bentuk sintaks pemrograman, maka:
 Faktorial(0) = 1 atau Faktorial(1) = 1 berlaku untuk persamaan (1)
 Faktorial(n) = n*Faktorial(n-1) berlaku untuk persamaan (2)

Contoh:
Dimana 𝑛 = 6 -> Faktorial(6), sehingga:
Faktorial(6) = 6*Faktorial(5);
Faktorial(5)= 5*Faktorial(4);
Faktorial(4)= 4*Faktorial(3);
Faktorial(3)= 3*Faktorial(2);
Faktorial(2)= 2*Faktorial(1);
Faktorial(1)= 1*Faktorial(0);

Persamaan (2) di atas adalah contoh hubungan rekuren (recurrence relation), yang berarti bahwa
nilai suatu fungsi dengan argumen tertentu bisa dihitung dari fungsi yang sama dengan argumen
yang lebih kecil. Persamaan (1) tidak bersifat rekursif, melainkan merupakan nilai awal atau base
case. Setiap fungsi rekursif paling sedikit mempunyai satu nilai awal, jika tidak fungsi tersebut
tidak bisa dihitung secara eksplisit.

Cobalah source code implementasi faktorial di bawah ini kemudian lihat bagaimana output-nya?
public class FindFactorialRecursive {

public static void main(String args[]) {


for (int i = 1; i < 10; i++) {
System.out.println(i + "! = " + findFactorial(i));
}
}

public static int findFactorial(int number) {


if ((number == 1) || (number == 0)) {
return 1;
} else {
return (number * findFactorial(number - 1));
}
}
}

2. Deret bilangan Fibbonacci didefinisikan sebagai berikut 1,1,2,3,5,8,13,21,34,55,89,…dst. Dari


barisan dapat diperhatikan bahwa bilangan Fibonacci pada urutan ke-3, 4, 5, 6, … , 𝑛 dimana
𝑛 > 2 dapat dicari dari penjumlahan dua bilangan sebelumnya, yaitu bilangan ke-(𝑛 − 1) dan
bilangan ke-(𝑛 − 2), sehingga dapat dirumuskan bahwa:
𝒇(𝒏) = 𝟏, 𝐝𝐢𝐦𝐚𝐧𝐚 𝒏 = 𝟏, 𝟐 (1)
𝒇(𝒏) = 𝒇(𝒏 − 𝟐) + 𝒇(𝒏 − 𝟏), 𝐝𝐢𝐦𝐚𝐧𝐚 𝒏 > 𝟐 (2)

Jika dibuat dalam bentuk sintaks pemrograman, maka:


 Fibonacci(1) = 1 atau Fibonacci(2) = 1 berlaku untuk persamaan (1)
 Fibonacci(n) = Fibonacci(n-2)+Fibonacci(n-1) berlaku untuk persamaan (2)

Contoh:
Dimana 𝑛 = 6 -> Fibonacci(6), sehingga:
Fibonacci(6) = Fibonacci(4)+Fibonacci(5);
Fibonacci(5) = Fibonacci(3)+Fibonacci(4);
Fibonacci(4) = Fibonacci(2)+Fibonacci(3);
Fibonacci(3) = Fibonacci(1)+Fibonacci(2);

Persamaan (1) adalah base case dan persamaan (2) adalah proses rekurennya. Berdasarkan
penjelasan diatas dapat dikatakan bahwa teknik rekursif ini mempunyai pro-kontra sendiri. Cukup
sulit untuk menentukan mana yang paling sederhana, paling jelas, paling efisien, dan paling
mudah untuk diimplementasikan antara teknik rekursif dan iteratif. Cara penyelesaian secara
terstruktur iterative biasa atau cara rekursif ini bergantung pada konteks permasalahan yang akan
dipecahkan dan sesuai dengan kesanggupan dari programmer yang bersangkutan.

Cobalah source code implementasi deret fibonacci di bawah ini kemudian lihat bagaimana output-
nya? Apakah ada perbedaan antara method fibo() dan fibo2()?
public class Fibo {

public static void main(String args[]) {


int n = 10;
for (int i = 1; i <= n; i++) {
System.out.print(fibo(i)+" ");
}
System.out.println("");
for (int i = 1; i <= n; i++) {
System.out.print(fibo2(i)+" ");
}
}

public static int fibo(int n) {


if (n == 2) {
return 1;
} else if (n == 1) {
return 1;
} else {
return fibo(n - 2) + fibo(n - 1);
}
}

public static int fibo2(int x) {


if (x == 0 || x == 1) {
return x;
} else {
return fibo2(x - 2) + fibo2(x - 1);
}
}
}

C. Tugas Praktikum
1. Implementasikan jawaban Quiz Anda yang lalu mengenai Bilangan Prima. Buatlah
program rekursif untuk mencetak 𝒏 bilangan prima! Bilangan prima adalah bilangan
yang habis dibagi dengan bilangan 1 dan bilangan itu sendiri. Misal: 𝑛 = 10, maka
mencetak bilangan prima dari 1 s.d. 10, output: 7,5,3,2 atau 2,3,5,7.
2. Meskipun dalam Java Collection sudah terdapat Math.pow untuk menyelesaikan
pemangkatan bilangan tertentu. Namun, kita dapat membuat fungsi pemangkatan
dengan cara rekursif. Buatlah program pemangkatan bilangan secara rekursif! Input dari
program berupa 𝑥 dan 𝑦, dimana 𝑥 adalah bilangan yang dipangkatkan dan 𝑦 adalah
pangkat dari bilangan. Output dari program adalah berikut ini:

3. Apa yang dikerjakan oleh program dibawah ini? Jelaskan proses rekursif untuk program
dibawah ini! Gambarkan step by step proses dalam diagram stack jika 𝑛𝑢𝑚 = 5.
public class DectoBin {
public static void decToBin(int num) {
if (num > 0) {
decToBin(num / 2);
System.out.print(num % 2);
}
}
public static void main(String[] args) {
decToBin(4);
System.out.println("");
decToBin(10);
System.out.println("");
decToBin(100);
}
}

Output:

__Good luck in everything you do! Have faith and never surrender__

Anda mungkin juga menyukai