• Tidak ada hasil yang ditemukan

Recursion, Algoritma, Struktur Data. Recursion. Erick Pranata. Edisi II

N/A
N/A
Protected

Academic year: 2021

Membagikan "Recursion, Algoritma, Struktur Data. Recursion. Erick Pranata. Edisi II"

Copied!
9
0
0

Teks penuh

(1)

Recursion

Recursion, Algoritma, Struktur Data

Recursion

Erick Pranata

Edisi II

04/04/2013

(2)

Definisi

Bayangkan definisi suatu frase yang bersifat sirkular

Status Galau: Kondisi galau yang dicerminkan dalam bentuk tulisan Perhatikan bahwa galau kembali digunakan untuk menerangkan status galau. Definisi tersebut menggunakan mengalihfungsikan kata-kata yang seharusnya dijelaskan, menjadi penjelas. Inilah yang disebut recursion.

Dalam dunia pemrograman, recursion tergolong dalam rumpun iteration (repetition, terdiri atas iteration dan recursion). Dengan demikian, struktur ini dapat digunakan untuk menjalankan statement yang berulang.

Thinking Recursively

Berpikir rekursif dapat dilakukan dengan:

1. memecah permasalahan menjadi masalah-masalah yang lebih kecil

2. menentukan pola umum yang digunakan untuk memecahkan masalah-masalah tersebut

3. menyatukannya untuk dapat menyelesaikan permasalahan secara utuh

Sebagai contoh, andaikata terdapat sebuah fungsi untuk menghitung total kuadrat dari bilangan m sampai n, SumSquares(m,n), dengan syarat m<=n, secara iteratif ia dapat dinyatakan sebagai berikut:

Code 1. SumSquares secara Iteratif function SumSquares(m, n) total = 0

for i = m to n

total = total + i*i next

(3)

Menyelesaikan problem ini secara rekursif dapat dilakukan dengan memecah masalah tersebut menjadi masalah masalah yang lebih kecil:

SumSquares(5, 10) = 52 + 62 + 72 + 82 + 92 + 102 SumSquares(6, 10) = 62 + 72 + 82 + 92 + 102 SumSquares(7, 10) = 72 + 82 + 92 + 102 SumSquares(8, 10) = 82 + 92 + 102 SumSquares(9, 10) = 92 + 102 SumSquares(10, 10) = 102

Perhatikan ilustrasi di atas. Bukankah, masalah-masalah tersebut dapat ditulis sebagai berikut? SumSquares(5, 10) = 52 + SumSquares(6, 10) SumSquares(6, 10) = 62 + SumSquares(7, 10) SumSquares(7, 10) = 72 + SumSquares(8, 10) SumSquares(8, 10) = 82 + SumSquares(9, 10) SumSquares(9, 10) = 92 + SumSquares(10, 10) SumSquares(10, 10) = 102

Dan jika digeneralisasi, bukankah akan menjadi berikut? SumSquares(m, n) = m2 + SumSquares(m+1, n) SumSquares(m, n) = 102 <- Jika m=n

Masalah tersebut ternyata hanya menjadi 2 pola saja! Perhatikan bahwa perulangan berhenti ketika nilai m=n. Dengan demikian bila digabungkan, fungsi tersebut dapat ditulis secara rekursif sebagai berikut:

Code 2. SumSquares secara Rekursif function SumSquares(m, n)

if m=n then

SumSquares = m * m 'Base Case else

SumSquares = m * m + SumSquares(m+1, n) 'Recursive Case end if

(4)

Beberapa contoh kasus lain yang dapat digunakan untuk mempelajari recursion adalah: 1. Faktorial 2. Fibonacci 3. Perkalian 4. Pangkat

Tracing

Tracing, atau pengkajian suatu fungsi atau prosedur rekursif dapat dilakukan dengan 2 cara:

1. Call Tree 2. Call Trace

Ambil contoh code 2. Semisal Anda ingin memeriksa apakah fungsi tersebut telah berjalan dengan benar, lakukan trace dengan menggunakan call tree sebagai berikut

(5)

atau call trace sebagai berikut

Gambar 2 Call Trace

Tower of Hanoi

Alkisah di suatu daerah di Asia, terdapat sejumlah biarawan yang berusaha memindahkan kepingan emas. Konon, ketika mereka selesai memindahkan ke 64 kepingan tersebut dari pilar 1 ke pilar 3, maka dunia akan hancur dan kembali ke masa awal, ketika dunia baru diciptakan. Ke 64 keping memiliki ukuran yang berbeda, dan para biarawan harus mematuhi 2 aturan:

1. Hanya 1 keping yang dapat dipindahkan pada suatu waktu

2. Keping yang lebih besar tidak boleh diletakkan di atas keping yang lebih kecil Jika mereka bekerja nonstop 24/7, dan butuh 1 detik untuk memindahkan sebuah keping, kapankah dunia akan hancur?

Ilustrasi permasalahan ini untuk 4 keping ditunjukkan pada gambar 3.

Gambar 3 Tower of Hanoi

(6)

Solusi untuk permasalahan ini dapat dicapai dengan langkah-langkah sebagai berikut:

1. Pindahkan 4 keping dari pilar 1 ke pilar 3

a. Pindahkan 3 keping dari pilar 1 ke pilar 2

i. Pindahkan 2 keping dari pilar 1 ke pilar 3

1. Pindahkan 1 keping dari pilar 1 ke pilar 2

a. Pindahkan sebuah keping dari pilar 1 ke pilar 2 2. Pindahkan sebuah keping dari pilar 1 ke pilar 3

3. Pindahkan 1 keping, dari pilar 2 ke pilar 3

a. Pindahkan sebuah keping dari pilar 2 ke pilar 3 ii. Pindahkan sebuah keping dari pilar 1 ke pilar 2

iii. Pindahkan 2 keping, dari pilar 3 ke pilar 2 1. dst…

b. Pindahkan sebuah keping dari pilar 1 ke pilar 3 c. Pindahkan 3 keping, dari pilar 2 ke pilar 3

i. Pindahkan 2 keping dari pilar 2 ke pilar 1 1. dst…

ii. Pindahkan sebuah keping dari pilar 2 ke pilar 3 iii. Pindahkan 2 keping, dari pilar 1 ke pilar 3

1. dst…

Memperhatikan urutan langkah di atas, dapat diketahui bahwa base case yang cocok adalah “Pindahkan sebuah keping dari pilar start ke pilar tujuan”. Perhatikan poin a, b, dan c di atas; Prosedur rekursif untuk mencetak solusi untuk Tower of Hanoi dapat ditulis demikian

Code 3. Tower of Hanoi

Sub ToH(n, start, tujuan, sementara) If n = 1 then

document.write " Pindahkan sebuah keping dari pilar " & start & " ke pilar " & tujuan & "<br/>"

else

(7)

Coba lakukan tracing. Benarkah prosedur tersebut?

Jika setiap aksi dihitung, berikut hasil yang diperoleh untuk tiap keping: Tabel 1

Jumlah Aksi berdasarkan Jumlah Keping

Jumlah Keping Jumlah Aksi

1 1 2 3 3 7 4 15 5 31 6 63 7 127 8 255

Dengan demikian dapat disimpulkan bahwa jumlah instruksi bersifat eksponensial, dimana bila terdapat n keping, maka akan terdapat 2n-1 aksi.

Kembali ke cerita para biarawan; Terdapat 64 keping emas dan untuk memindahkan 1 keping, diperlukan 1 detik. Jika dalam 1 tahun, terdapat 31.536.000 detik, maka waktu yang diperlukan bagi para biarawan untuk memindahkan seluruh keping tersebut adalah (264-1)/ 31.536.000 = 584.942.417.355 tahun. Jadi, kita masih akan tetap hidup untuk beberapa saat…

Divide and Conquer

Merupakan suatu strategi dalam menyelesaikan suatu masalah dengan:

1. Memecahnya menjadi subproblems yang lebih kecil dengan karakteristik yang sama

2. Menyelesaikan setiap subproblems secara rekursif 3. Menggabungkan setiap jawaban secara tepat

Dengan strategi ini, setiap masalah akan dipecah menjadi masalah-masalah yang lebih kecil yang serupa dan sama, kemudian secara rekursif diselesaikan; jawaban yang diperoleh lalu digabungkan satu demi satu hingga solusi akhir diperoleh.

Lihat kembali fungsi rekursif SumSquares yang berguna untuk menjumlahkan bilangan kuadrat dalam rentang tertentu pada Code 2.

(8)

SumSquares(5, 10) = 52 + 62 + 72 + 82 + 92 + 102 = 355

Permasalahan di atas dapat diselesaikan dengan pendekatan divide and conquer, dengan memecah-mecah masalah tersebut.

Gambar 4

Call Tree untuk SumSquares dengan Divide and Conquer

Dengan demikian, fungsi rekursif tersebut dapat disesuaikan menjadi sebagai berikut: Code 4. SumSquares dengan Divide and Conquer

function SumSquares(m, n) if m = n then

SumSquares = m * m else

tengah = (m+n)\2

SumSquares = SumSquares(m,tengah) + SumSquares(tengah+1,n) end if

end function

Keuntungan strategi ini adalah penghematan memori yang digunakan. Hal ini dapat dilakukan dengan membandingkan gambar 1 dan gambar 4. Bukankah kedalaman Call Tree yang dihasilkan dengan strategi Divide and Conquer menjadi lebih kecil? Dengan demikian, memori yang dibutuhkan pun semakin kecil.

(9)

Implementasi: Sierpinski Fractal

Salah satu contoh implementasi teknik recursion adalah penggambaran fractal (gambar yang dibentuk dengan menggambar dirinya sendiri). Salah satu fractal sederhana yang dapat diimplementasikan secara rekursif adalah Sierpinski Fractal:

Algoritma 1. Gambar Segitiga

Prosedur Segitiga(t1, t2, t3, jumlah)

Jika jumlah = 0 maka gambarkan segitiga berdasarkan 3 titik Jika tidak

Temukan titik tengah (t1, t2) -> t12 Temukan titik tengah (t1, t3) -> t13 Temukan titik tengah (t2, t3) -> t23 Segitiga(t1, t12, t13, jumlah-1) Segitiga(t2, t12, t23, jumlah-1) Segitiga(t3, t13, t23, jumlah-1) Kembali

Algoritma 2. Pembuatan Fractal

1. Tentukan 3 titik awal -> t1, t2, t3 2. Tentukan jumlah perulangan -> jumlah 3. Segitiga(t1, t2, t3, jumlah)

Referensi

Thomas A. Standish, Data Structures, Algorithms & Software Principles in C, Addison-Wesley Publishing Company, 1995.

Gambar

Gambar 2  Call Trace

Referensi

Dokumen terkait

Ini disebabkan antara harapan dan penilaian pelayanan yang diterima tidak sesuai dengan yang diinginkan sehingga menimbulkan perasaan yang kurang puas pada siswa kursus

Hal ini sebagaimana ditegaskan dalam pasal 2 Undang-undang nomor 31 tahun 1999, hal ini bertujuan untuk mempernudah pembuktian tentang keberadaan sifat tercelanya suatu

masing gaya kognitif (field dependent dan field independent), manakah yang memberikan prestasi belajar matematika lebih baik antara model pembelajaran

Jika calon yang tersedia 3 orang matematikawan dan 5 orang teknisi, maka banyaknya cara menyusun tim tersebut adalah … Mencari solusi dari permasalahan kontektual

Bentuk tubuh juga menjadi pertimbangan, jika kamu gemuk jangan pakai celana ketat sampai lututmu tidak terlihat, maka kenakan pakaian bergaris vertikal atau memanjang agar

Cahya Anggara (Guru PKn): Upaya yang dilakukan guna mengatasi hambatan dalam pengembangan pembelajaran Pendidikan Kewarganegaraan (PKn) yang mendorong pembentukan karakter

Persoalan cabai merah sebagai komoditas sayuran yang mudah rusak, dicirikan oleh produksinya yang fluktuatif, sementara konsumsinya relatif stabil. Kondisi ini menyebabkan

Kunci Ide : Kita dapat membangun 95% selang kepercayaan dari nilai yang masuk akal unutk suatu parameter dengan menyertakan semua nilai yang jatuh pada kedua standar deviasi dari