1
BAB II PROSES REKURSI DAN ITERASI
2.1. Konsep Rekursi dan Iterasi
Proses rekursi merupakan suatu fenomena yang menarik dalam pemrograman komputer. Rekursi adalah suatu proses perulangan untuk menyelesaikan suatu permasalahan berdasarkan suatu hubungan rekurens (recurrence relation). Rekursi dapat didefinisikan sebagai suatu prosedur atau fungsi yang melakukan eksekusi dengan memanggil atau memproses subprogram yang arahnya ke prosedur atau fungsi dirinya sendiri. Artinya, bahwa nilai suatu fungsi dengan argumen tertentu dapat dihitung dari fungsi yang sama dengan argumenargumen yang mempunyai hubungan rekurens. Jelasnya, prosedur rekursi adalah suatu proses berulang yang dilaksanakan dengan cara memanggil prosedur atau fungsi yang sama yaitu dirinya sendiri. Proses pemanggilan ke prosedur atau fungsi dirinya sendiri tersebut berlangsung secara berulang-ulang yang dapat berarti tidak diketahui kapan proses tersebut akan berakhir.
Sedangkan iterasi merupakan suatu proses perulangan yang dilaksanakan oleh suatu prosedur atau fungsi atau sub program dengan cara memasukkan secara langsung nilai-nilai argumennya. Dalam proses iterasi, proses perulangan dikendalikan oleh suatu pencacah (counter) yang akan selalu berubah setiap kali selesai dilakukan proses perulangan.
Dalam prakteknya, kita dapat secara bebas memilih salah satu di antara kedua teknik tersebut untuk diterapkan dalam program aplikasi. Namun sebagai seorang programer yang baik tentu harus mampu mengembangkan sebuah program aplikasi yang efisien dan optimal. Oleh karenanya kita harus mempertimbangkan tentang beberapa aspek untuk menentukan salah satu teknik yang paling tepat di antara kedua teknik tersebut untuk digunakan. Aspekaspek yang dimaksud adalah :
1. Efisiensi proses eksekusi program
2
2. Kemudahan penggunaan / penerapan dalam program aplikasi 3. Kejelasan logika untuk mengecek validitas prosedur 4. Kesederhanaan pengguna statemen dalam program
Sungguh sangat sulit untuk menjawab pertanyaan apakah program yang menggunakan prosedur rekursi akan lebih baik bila dibandingkan dengan program yang menggunakan prosedur iterasi. Ataukah justru sebaliknya, prosedur secara iterasi akan lebih baik digunakan dalam program.
Sebagaimana terjadi pada setiap permasalahan yang akan diselesaikan yang tidak
terbatas
dalam
dunia
pemrograman
komputer,
setiap
alternatif
penyelesaian akan selalu mempunyai kelebihan dan kelemahan yang tentu saja akan menjadi lebih baik untuk diterapkan jika terjadi kesesuaian antara kondisi pemasalahan dengan karakteristik yang dimiliki oleh teknik yang digunakan. Sehubungan dengan hal tersebut penerapan teknik rekursi dan iterasi juga akan memberikan hasil yang terbaik jika memenuhi keempat aspek tersebut di atas. Hal ini berarti bahwa kita tidak akan dapat menentukan prosedur yang lebih unggul di antara kedua prosedur di atas sebelum mengetahui permasalahannya.
Pembahasan dalam bab ini, akan membawa Pembaca ke dalam suatu pemahaman tentang kedua teknik tersebut dan pada akhirnnya akan dapat membandingkan
dan mengetahui tentang keunggulan dan kelemahan
penggunaan teknik rekursi dan iterasi. Selanjutnya diharapkan, Pembaca akan mampu menentukan salah satu teknik yang sesuai untuk diterapkan pada saat menyelesaikan permasalahan pemrograman yang dihadapi .
2.2. Beberapa Contoh Permasalahan
Untuk membantu memahami proses yang terjadi dalam teknik rekursi dan iterasi, berikut ini akan disajikan beberapa contoh permasalahan yang sering dijumpai dalam pemrograman komputer yang dapat diselesaikan secara rekursi dan iterasi. Dengan memahami contoh-contoh yang disajikan diharapkan Pembaca akan memahami proses yang terjadi dalam kedua teknik tersebut, dapat
3
membedakan kedua teknik tersebut jika diterapkan ke dalam program-program aplikasi, serta dapat menentukan teknik yang paling tepat untuk digunakan dalam program aplikasi yang akan dikembangkan.
2.2.1 Perkalian Dua Bilangan Integer
Dalam contoh berikut ini akan disajikan tentang bagaimana menyelesaikan permasalahan perkalian dua bilangan bulat prositif (integer) yang dapat diselesaikan secara rekursi dan iterasi. Dalam cara yang pertama, permasalahan tersebut akan diselesaikan dengan teknik rekursi yang dapat dinotasikan sebagai berikut ini :
Kali(A,B) = A
; jika B = 1
Kali(A,B) = (A + Kali (A,B-1)) ; jika B > 1
Arti dari masing-masing notasi di atas adalah sebagai berikut :
Kali(A,B) : nilai hasil operasi perkalian antara A dan B A dan B : nilai-nilai bilangan yang dioperasikan (operand)
Dari contoh di atas dapat dipahami, bahwa jika B mempunyai harga 1, maka nilai pada Kali(A,B) akan sama dengan harga A. Sebaliknya jika B mempunyai harga lebih dari 1, maka nilai pada Kali(A,B) tidak dapat langsung ditemukan, tetapi harus dihitung terlebih dahulu nilai pada Kali(A,B-1). Untuk mendapatkan nilai pada Kali(A,B-1) harus dihitung terlebih dahulu nilai pada Kali(A,B-2). Untuk memperoleh nilai Kali(A,B-2) harus dihitung terlebih dahulu nilai pada Kali(A,B-3), dan untuk memperoleh nilai Kali(A,B-3) harus dihitung terlebih dahulu nilai pada Kali(A,B-4). Demikian seterusnya proses ini akan selalu diulang secara selama nilai B lebih dari 1.
Solusi dalam bentuk flowchart untuk menyelesaikan perkalian dua bilangan integer yang dilakukan secara rekursi ditunjukkan pada Gambar 2.1. Sedangkan solusi dalam bentuk algoritmanya dapat dituliskan sebagai berikut ini:
4
A dan B merupakan variabel untuk menyimpan nilai-nilai bilangan yang akan dikalikan. Kali(A,B) merupakan variabel untuk menyimpan nilai hasil operasi perkalian A dan B. 1. Mulai 2. Proses berulang langkah-2 untuk mengecek apakah harga B = 1 IF B=1 Jika ya, Kali(A,B) = A, lanjutkan ke langkah-3 Jika tidak, Kali(A,B) = A + Kali (A,B-1) 3. Cetak hasil Kali (A,B) 4. Selesai
Mulai
Baca A, B
TIDAK
YA B=1 Kali(A,B) = A
Kali(A,B) = A+Kali(A,B-1)
Cetak Kali(A,B)
Selesai
Gambar 2.1 : Flowchart prosedur perkalian dua bilangan integer secara rekursi
Untuk lebih jelasnya, perhatikan proses yang terjadi dalam perkalian dua bilangan integer yang dilakukan secara rekursi dalam contoh-contoh berikut ini :
5
6x1
=6
6x2
= 6 + 6(2-1) =6+6 = 12
6x3
= 6 + 6(3-1) = 6 + 6 + 6 (3-2) =6+6+6 = 18
6x4
= 6 + 6(4-1) = 6 + 6 + 6(4-2) = 6 + 6 + 6 + 6(4-3) =6+6+6+6 = 24
Dalam contoh-contoh di atas, A mempunyai harga 6 dan B mempunyai harga 1, 2, 3, dan 4. Perhatikan apa yang akan terjadi seandainya harga A=1, dan B mempunyai harga yang sangat besar. Tentu saja, jika terjadi demikian maka proses yang terjadi dalam prosedur rekursi tersebut akan mengulang proses penjumlahan harga A (=1) secara berulang sebanyak B kali. Proses seperti ini tentu menjadi sangat tidak efisien untuk dilakukan.
Permasalahan tersebut sebenarnya dapat diatasi dengan memberikan sedikit modifikasi pada prosedur di atas. Modifikasi dapat dilakukan dengan memberikan langkah tambahan untuk melakukan pengecekan guna membandingkan besarnya harga A dan B. Proses pengecekan ini dilakukan pada bagian awal proses. Harga masukan yang lebih kecil selanjutnya ditetapkan sebagai A. Dengan melakukan modifikasi seperti ini, maka proses rekursi dalam perkalian dua bilangan integer akan menjadi lebih baik / efisien.
6
Solusi dalam bentuk algoritma perkalian dua bilangan integer hasil modifikasi tersebut dapat dituliskan sebagai berikut ini:
A dan B merupakan variabel untuk menyimpan nilai-nilai bilangan yang akan dikalikan. BANTU merupakan variabel bantuan untuk menukar nilai A dan B Kali(A,B) merupakan variabel untuk menyimpan nilai hasil operasi perkalian A dan B. 1. Mulai 2. Cek apakah B lebih dari A IF B > A Jika ya, BANTU = A A=B B=A 3. Proses berulang langkah-3 untuk mengecek apakah harga B = 1 IF B = 1 Jika ya, Kali(A,B) = A, lanjutkan ke langkah-4 Jika tidak, Kali(A,B) = A + Kali (A,B-1) 4. Cetak hasil Kali (A,B) 5. Selesai
Teknik kedua untuk menyelesaikan perkalian dua bilangan integer adalah menyelesaikannya secara iterasi. Notasinya dapat dituliskan sebagai berikut :
Kali(A,B) = A+A+A+A+...+A B kali Perulangan penambahan A pada fungsi Kali(A,B) dilakukan sebanyak B kali.
Contoh :
6x1 =6 1 kali
7
6x2=6+6 2 kali = 12
6x3=6+6+6 3 kali = 18
6 x 4 = 6+6+6+6 4 kali = 24
Flowchart penerapan teknik iterasi untuk perkalian dua bilangan integer dalam contoh di atas ditunjukkan pada Gambar 2.2. Selanjutnya, solusi dalam bentuk algoritma untuk perkalian dua bilangan integer dengan teknik iterasi dapat dituliskan sebagai berikut ini :
A dan B merupakan variabel untuk menyimpan nilai bilangan yang akan dikalikan. Kali(A,B) merupakan variabel untuk menyimpan nilai hasil operasi perkalian A dan B. 1. Mulai 2. Tentukan, harga awal fungsi Kali(A,B) Kali(A,B) = 0 3. Proses berulang langkah-3 selama B<>0 Cek harga B WHILE B <>0 Jika ya, hitung Kali(A,B) = Kali(A,B) + A B=B-1 4. Cetak hasil Kali(A,B) 5. Selesai
8
Mulai
Baca A,B
Kali(A,B) =0
Kali(A,B) = Kali(A,B) + A
TIDAK
YA B=0
Kali (A,B)
B=B-1
Selesai
Gambar 2.2 : Flowchart prosedur perkalian dua bilangan integer secara iterasi
Dalam cara iterasi, juga mungkin terjadi kasus perkalian bilangan 1 dengan suatu bilangan
lain
yang
mempunyai
harga
sangat
besar,
sehingga
akan
mengakibatkan diulangnya proses perulangan yang tidak efisien. Hal ini juga dapat diatasi dengan memberikan sedikit modifikasi sebagaimana dilakukan pada bagian sebelumnya pada teknik rekursi.
Efektifitas proses perkalian dua bilangan integer dalam contoh-contoh di atas sangat ditentukan oleh berapa kali langkah yang harus dilakukan untuk menemukan hasil akhir perhitungan yang dicari. Dengan membandingkan kedua contoh penyelesaian masalah di atas, kita dapat menarik kesimpulan bahwa
9
penggunaan teknik iterasi untuk mengalikan dua bilangan integer pada umumnya akan lebih efektif dari pada jika dikerjakan dengan teknik rekursi.
2.2.2. Mencari Bilangan FIBONACCI
Bilangan FIBONACCI adalah suatu deret bilangan bulat positif (integer) tak berhingga yang secara berurutan adalah didefinisikan sebagai berikut ini :
1 1 2 3 5 8 13 21 34 58 89 . . . dst
Jika diamati deret bilangan FIBONACCI di atas, maka dapat dipahami bahwa nilai bilangan FIBONACCI suku ke-n dalam deret tersebut dapat dihitung dengan menjumlahkan dua bilangan terdekat pada urutan sebelumnya.
Sebagai contoh, suku bilangan ke-6 dapat dihitung dengan menjumlahkan suku bilangan ke-5 dan ke-4. Nilai bilangan FIBONACCI suku-5 dapat dihitung dengan cara menjumlahkan suku bilangan ke-4 dan ke3. Nilai bilangan FIBONACCI suku-4 dapat dihitung dengan cara menjumlahkan suku bilangan ke-3 dan ke-2. Nilai bilangan FIBONACCI suku-3 dapat dihitung dengan cara menjumlahkan suku bilangan ke-2 dan ke-1.
Secara umum nilai bilangan FIBONACCI suku-n dapat dihitung dengan menjumlahkan nilai-nilai bilangan FIBONACCI suku-(n-1) dan ke-(n-2). Dengan demikian, nilai-nilai bilangan FIBONACCI untuk n=1 dan n=2 merupakan nilainilai awal yang perlu ditetapkan sebelumnya. Nilai-nilai awal tersebut digunakan sebagai dasar untuk menghitung nilai-nilai bilangan FIBONACCI untuk suku-suku berikutnya, yaitu bernilai 1 (lihat deret FIBONACCI di atas).
Pencarian nilai suku bilangan FIBONACCI secara rekursi dapat dinotasikan sebagai berikut ini :
FIBONACCI(n)= n
; jika n=1 atau n=2
FIBONACCI(n)= FIBONACCI(n-1)+FIBONACCI(n-2)
; jika n>2
10
Contoh : Mencari bilangan FIBONACCI suku ke-4 dapat dihitung secara rekursi dengan cara sebagai berikut :
FIBONACCI (4) = FIBONACCI(3)
+ FIBONACCI(2)
= FIBONACCI(2)+FIBONACCI(1)+
=
1
=
3
+
1
+
1
1
Ingat nilai bilangan FIBONACCI suku ke-2 dan ke-1 adalah 1, sehingga dari hasil perhitungan diperoleh harga FIBONACCI suku ke-4 adalah sama dengan 3. Untuk harga-harga bilangan FIBONACCI pada suku-suku selanjutnya dapat dihitung dengan cara yang sama seperti di atas. Tentu bukan hal yang sulit untuk melakukannya, tetapi perlu kecermatan untuk mendapatkan hasil akhir perhitungan yang benar.
Mulai
Baca n YA
TIDAK n = 1 OR n = 2
FIBONACCI (n) = 1
FIBONACCI (n) = FIBONACCI(n-1) + FIBONACCI (n-2)
Cetak FIBONACCI (n)
Selesai
Gambar 2.3 : Flowchart prosedur mencari bilangan FIBONACCI secara rekursi
11
Flowchart prosedur untuk mencari nilai bilangan FIBONACCI suku ke-n secara rekursi ditunjukkan Gambar 2.3. Sedangkan, solusi dalam bentuk algoritmanya dapat dituliskan sebagai berikut ini :
Masukan suku bilangan FIBONACCI yang akan dicari (=n). FIBONACCI merupakan variabel untuk menyimpan harga suku bilangan Fibonacci yang dicari. 1. Mulai 2. Baca n 3. Proses berulang langkah-2 Cek harga n IF (n=1) OR (n=2) Jika ya, FIBONACCI(n) = 1, lanjutkan ke langkah-4 Jika tidak, FIBONACCI(N) = FIBONACCI(n - 1) + FIBONACCI(n - 2) 4. Cetak hasil FIBONACCI(n) 5. Selesai
Cara lain untuk menghitung nilai suku bilangan FIBONACCI adalah dengan menggunakan teknik iterasi. Dalam teknik iterasi nilai suku bilangan FIBONACCI dihitung dengan melaksanakan suatu proses perulangan yang memanfaatkan nilai bilangan FIBONACCI suku ke-1 sebagai dasar perhitungan untuk mencari nilai pada suku ke-2. Nilai pada suku ke-2 digunakan sebagai dasar mencari nilai suku ke-3. Nilai pada suku ke-3 digunakan sebagai dasar mencari nilai suku ke4. Demikian seterusnya hingga nilai bilangan FIBONACCI pada suku ke-n yang dikehendaki ditemukan. Flowchart prosedur untuk mencari nilai bilangan FIBONACCI suku ke-n dengan teknik iterasi ditunjukkan pada Gambar 2.4.
Logika proses yang terjadi pada teknik iterasi untuk mencari nilai bilangan FIBONACCI suku ke-n adalah dimulai dengan penetapan harga-harga awal untuk variabel I, FIBONACCI, dan TERAKHIR. I digunakan sebagai variabel pencacah (counter) dalam proses perulangan. FIBONACCI digunakan sebagai variabel bilangan FIBONACCI yang mempunyai harga awal 1 pada suku ke-1.
12
TERAKHIR
digunakan
sebagai
variabel
untuk
menyimpan
harga
hasil
perhitungan bilangan FIBONACCI terakhir pada setiap kali perulangan. Harga awal untuk variabel TERAKHIR adalah 1.
Langkah selanjutnya adalah pengecekan harga n yang merupakan variabel untuk menyimpan data suku ke berapa yang akan dicari. Jika n=1, artinya akan dihitung harga bilangan FIBONACCI suku ke-1, maka nilainya adalah 1 yaitu harga awal yang telah ditetapkan. Sebaliknya, jika n>1, maka akan dilakukan proses berulang selama harga pancacah I kurang dari atau sama dengan n. Variabel BANTU digunakan sebagai variabel bantuan untuk menyimpan nilai sementara suku terakhir dalam deret FIBONACCI selama proses perulangan. Pada akhirnya proses akan berhenti dan nilai yang dicari akan diketemukan jika I=n, dan hasil perhitungannya tersimpan dalam variabel FIBONACCI.
Algoritma untuk mencari nilai bilangan FIBONACCI suku ke-n dengan menerapkan teknik iterasi adalah dituliskan sebagai berikut ini :
Masukkan harga suku bilangan FIBONACCI yang akan akan dicari (n). FIBONACCI merupakan variabel untuk menyimpan harga bilangan fibonacci yang dicari. BANTU merupakan variabel bantuan untuk menampung hasil perhitungan sementara. 1. Mulai 2. Tentukan harga-harga awal I, FIBONACCI, dan TERAKHIR I=1 FIBONACCI = 1 TERAKHIR = 0 3. Cek harga n IF n = 1 Jika ya, maka FIBONACCI = 1, lanjutkan ke langkah-6 4. Proses berulang langkah-4 hingga langkah-5 untuk menghitung FIBONACCI Hitung BANTU = FIBONACCI I=I+1
13
5. Hitung FIBONACCI = FIBONACCI + TERAKHIR TERAKHIR = BANTU 6. Cetak Hasil FIBONACCI 7. Selesai
Mulai
I=1 FIBOANCCI = 1 TERAKHIR = 1
TIDAK
YA n=1 FIBONACCI = 1
n<>1 Bantu = FIBONACCI I = I+ 1
FIBONACCI = FIBONACCI + TERAKHIR TERAKHIR = BANTU
Cetak FIBONACCI
Selesai
Gambar 2.4. : Flowchart prosedur mencari bilangan FIBONACCI secara iterasi
Sebagaimana terjadi dalam perkalian dua bilangan integer, dalam contoh kasus perhitungan nilai bilangan FIBONACCI ini, secara umum teknik iterasi mampu melaksanakan proses perhitungan secara lebih efisien dibandingkan jika
14
diselesaikan dengan menerapkan teknik rekursi. Dan tentu saja, hasil perhitungannya akan dapat ditemukan secara lebih cepat.
Cobalah untuk menghitung berapa kali proses perulangan yang harus dilakukan untuk mencari nilai bilangan FIBONACCI suku ke-1, ke-2, ke-3, ke-4, dan ke-5 apabila diselesaikan secara rekursi. Bandingkan hasilnya jika diselesaikan secara iterasi, prosedur manakah yang lebih baik untuk diterapkan dalam perhitungan bilangan FIBONACCI tersebut.
2.2.3. Mencari Nilai Faktorial Bilangan Integer
Faktorial suatu biangan dalam matematika dinotasikan menggunakan tanda " ! " yang dituliskan di belakang bilangan yang akan dihitung faktorialnya. Harga Faktorial merupakan hasil perkalian suku-suku pada suatu bilangan yang dihitung. Berikut ini diberikan contoh untuk menghitung nilai Faktorial suatu bilangan, yaitu :
6!
=6x5x4x3x2x1 = 720
5!
=5x4x3x2x1 = 120
4!
=4x3x2x1 = 24
3!
=3x2x1 =6
2!
=2x1 =2
1!
= 1 (digunakan sebagai nilai awal)
15
Mencari nilai faktorial suatu bilangan bulat positif (integer) sebagaimana contoh di atas merupakan contoh permasalahan lain yang dapat diselesaikan dengan menerapkan teknik iterasi maupun teknik rekursi. Secara rekursi notasi untuk menghitung nilai faktorial dapat dituliskan sebagai berikut :
FAKTORIAL(n) = 1
; jika n = 0
FAKTORIAL(n) = n x FAKTORIAL(n-1)
; jika n > 0
Contoh : 5! = 5 x 4! = 5 x 4 x 3! = 5 x 4 x 3 x 2! = 5 x 4 x 3 x 2 x 1! = 5 x 4 x 3 x 2 x 1 x 0! = 5 x 4 x 3 x 2 x 1 x 1 x 1 = 120
Dalam kasus seperti ini, maka proses dalam prosedur akan melompat ke dalam fungsi dirinya selama harga n > 0. dalam contoh di atas, harga dari 5! adalah 120. Selanjutnya flowchart prosedur untuk menghitung nilai faktorial suatu bilangan secara rekursi ditunjukkan pada Gambar 2.5.
Solusi dalam bentuk algoritma untuk menghitung nilai faktorial suatu bilangan secara rekursi dapat dituliskan sebagai berikut ini :
Masukkan bilangan yang akan dihitung nilai faktorialnya (=n). FAKTORIAL merupakan variabel untuk menyimpan harga faktorial yang dicari. 1. Mulai 2. Proses berulang langkah-2 Cek harga n IF n = 0 Jika ya, FAKTORIAL(n) = 1, lanjutkan ke langkah-3 Jika tidak, FAKTORIAL(n) = n x FAKTORIAL(n – 1) 3. Cetak hasil
16
FAKTORIAL(n) 4. Selesai
Mulai
Baca n
n=0 FAKTORIAL(n) = 1
FAKTORIAL(n)= nxFAKTORIAL(n-1)
Cetak FAKTORIAL(n)
Selesai
Gambar 2.5. : Flowchart prosedur menghitung nilai Faktorial secara rekursi
Cara lain untuk menghitung nilai Faktorial adalah menyelesaikannya dengan menggunakan teknik iterasi. Dalam cara kedua ini, nilai Faktorial dihitung dengan melakukan suatu proses perulangan untuk mengalikan setiap faktor bilangan yang dicari nilai faktorialnya. Dalam contoh berikut / counter yaitu X. Hasil perhitungan pada setiap iterasi perulangan ditampung pada variabel memori yaitu AKHIR. Hasi akhir nilai faktorial yang dicari akan diperoleh setelah proses perulangan berhenti yaitu ketika X=0 dan akan disimpan dalam variabel yang dinamakan FAKTORIAL.
Flowchart prosedur untuk menghitung nilai faktorial dengan teknik iterasi adalah ditunjukan pada Gambar 2.6. Sedangkan solusi dalam bentuk algoritma prosedur untuk menghitung nilai faktorial secara iterasi dapat dituliskan sebagai berikut :
17
Masukkan bilangan yang akan dicari nilai faktorialnya (=n). X, BANTU dan AKHIR adalah variabel bantuan untuk menghitung nilai faktorial. 1. Mulai 2. Tentukan harga-harga awal X dan AKHIR X=n AKHIR = 1 3. Proses berulang selama x <> 0 WHILE X <> 0 Hitung
AKHIR = AKHIR x X X=X-1
4. Tentukan FAKTORIAL = AKHIR 5. Cetak hasil FAKTORIAL 6. Selesai
Mulai
X=n AKHIR = 1 YA
TIDAK While X <> 0
AKHIR = AKHIR x X X=X-1
FAKTORIAL = AKHIR
Cetak FAKTORIAL
Selesai
Gambar 2.6. : Flowchart prosedur menghitung nilai faktorial secara iterasi
18
Dalam
contoh
kasus
mencari
nilai
Faktorial
suatu
bilangan,
ternyata
penyelesaian akan lebih efisien jika diselesaikan dengan prosedur secara iterasi. Logika proses penyelesaiannya begitu mudah dipahami, proses perhitungannya sederhana, dan mudah, sehingga memudahkan dalam pengecekan jika terjadi kesalahan dalam prosedur penyelesaian. Sehingga teknik iterasi relatif lebih baik dibanding teknik rekursi.
2.3. Keunggulan Dan Kelemahan Teknik Rekursi dan Iterasi
Dengan mencermati beberapa contoh yang disajikan di atas, maka beberapa keunggulan dan kelemahan penggunaan teknik rekursi dan iterasi dalam program-program aplikasi akan dapat saling dibandingkan. Berikut adalah pernyataan umum berkaitan dengan penggunaan teknik rekursi dan iterasi yang dapat disimpulkan berkaitan dengan dua teknik tersebut.
1. Kecepatan Pada umumnya pemakaian teknik iterasi mempunyai kecepatan yang lebih tinggi jika dibandingkan jika menggunakan teknik rekursi. Alasan utamanya, karena teknik rekursi mempunyai jumlah langkah keluar masuk blok fungsi atau prosedur secara berulang yang relatif jauh lebih banyak. Prosedur rekursi melakukan proses berulang yang sebenarnya telah dilakukan sebelumnya. Selain itu teknik rekursi harus melakukan langkah-langkah tambahan sehubungan dengan operasi "tumpukan" (stack) yang diakibatkan proses perulangan pada fungsi dirinya sendiri.
2. Kemudahan dipahami Pada umumnya logika program aplikasi yang menerapkan teknik iterasi relatif lebih mudah dipahami. Hal ini sangat bermanfaat bagi keperluan pengecekan kesalahan prosedur dalam program dan kemudian membetulkannya (debuging).
3. Keterbatasan penggunaan
19
Secara nalari kita akan lebih mudah menerapkan teknik iterasi ke dalam prgram-program aplikasi dari pada menggunakan teknik rekursi. Ini merupakan alasan subyektif yang sangat bergantung pada diri kita masingmasing. Namun demikian, pada beberapa kasus pemrograman ada kalanya kita tidak mungkin dapat menghindarkan diri untuk menggunakan teknik rekursi pada beberapa permasalahan yang hanya akan dapat diselesaikan menggunakan teknik rekursi.
Salah satu contoh kasus permasalahan yang hanya akan dapat diselesaikan secara efisien jika menggunakan teknik rekursi adalah permainan Menara Hanoi yang sangat sulit bagi kita untuk menentukan sampai kapan program harus berhenti melakukan proses perulangan. Penyelesaian permainan Menara Hanoi telah banyak dibahas dalam buku-buku pemrograman yang beredar saat ini, sehingga tidak akan dibahas dalam buku ini.
Beberapa contoh permasalahan lain yang dapat diselesaikan dengan menerapkan teknik rekursi dan iterasi adalah proses pencarian (searching) data dari suatu larik data yang telah urut. Jika cacah data sangat besar, tentu saja akan lebih efisien jika diselesaikan menggunakan teknik rekursi yaitu dengan metoda "binary search" dari pada menggunakan teknik iterasi dalam metoda "linear search" (kedua metoda ini akan dibahas pada Bab VI).
Teknik rekursi merupakan suatu teknik pemrograman yang penting dan berdaya guna untuk digunakan pada penyelesaian masalah-masalah pemrograman yang perlu mengekspresikan ke dalam suku-suku dari program dengan menambahkan langkah-langkah sejenis (menggunakan fungsi yang sama) berdasarkan suatu hubungan rekurens (recurance relations). Dalam hal ini teknik rekursi mempunyai tingkat efisiensi yang lebih baik dari pada penggunaan teknik iterasi.
4. Penggunaan memori Dalam hal pemanfaatan memori, teknik rekursi akan menghasilkan peta penggunaan memori yang terstruktur, sedangkan teknik iterasi tidak demikian.
20
5. Keterbatasan perangkat lunak bahasa pemrograman Penggunaan teknik rekursi akan memberikan implementasi struktur data "tumpukan" (stack) yang dilakukan secara internal oleh komputer. Akibatnya, tidak semua bahasa pemrograman komputer mampu melakukan teknik rekursi. Namun demikian bahasa-bahasa pemrograman versi baru telah mendukung penerapan teknik rekursi, misal bahasa C++, Turbo C, Turbo Pascal, Asembler, dan lain-lain.
Khusus untuk bahasa Assembler, sekalipun mendukung penggunaan teknik rekursi artinya bahwa programer dapat memanfaatkan bahasa pemrograman tersebut untuk memecahkan permasalahan dengan menggunakan teknik rekursi, namun programmer harus merancang dan menginisialisasikan sendiri tentang pengolahan operasi tumpukan (stack).
Sebagai catatan tambahan, pada akhirnya penggunaan teknik rekursi atau iterasi pada program-program aplikasi adalah bergantung pada masing-masing pemrogram aplikasi. Mungkin dalam kasus-kasus tertentu teknik rekursi akan lebih baik diterapkan, namun karena tak cukup mampu atau karena lebih suka menggunakan teknik iterasi yang sebenarnya sangat bertele-tele dan tidak efisien, dan pada akhirnya tekni iterasi yang dipilih dan digunakan, maka tidak mungkin bagi orang lain untuk mencegahnya.
Sebagai pesan pada akhir bab ini, kita harus berusaha untuk merancang dan mengembangkan program aplikasi yang efisien dan optimal. Gunakanlah teknik rekursi atau iterasi secara tepat. Kita perlu merancang dan mengembangkan program-program aplikasi yang berkualitas, efisien, dan efektif.