Anda di halaman 1dari 4

Modul Praktikum Algoritma & Pemrograman II

MODUL II REKURSIF

2.1

TUJUAN MODUL

Tujuan modul ini, adalah : 1. Memperkenalkan teknik dan teknik pemrograman secara rekursif dalam perangkat lunak bahasa pemrograman C++. 2. Mempraktekkan dan membuktikan teknik pemrograman secara rekursif secara teori di kuliah dengan hasil program yang dibuat di praktikum. 3. Memahami fungsi atau kegunaan dari masing-masing teknik dan pemrosesan rekursif.

2.2 2.2.1

TEORI Pendahuluan

Rekursif berarti suatu proses yang memanggil dirinya sendiri. Dalam rekursif sebenarnya terkandung pengertian prosedur atau fungsi. Perbedaannya adalah bahwa rekursif bisa memanggil ke dirinya sendiri, tetapi prosedur atau fungsi harus dipanggil lewat pemanggil prosedur atau fungsi. Rekursif merupakan teknik pemrograman yang penting, dan beberapa bahasa pemrograman modern mendukung keberadaan proses rekursif ini. Pemanggilan prosedur atau fungsi ke dirinya sendiri bisa berarti proses yang berulang yang tidak bisa diketahui kapan akan berakhir. Dalam pemakaian sehari-hari, rekursi merupakan teknik pemrograman yang berdaya guna untuk digunakan pada pekerjaan pemrograman dengan mengeksperisikannya ke dalam suku-suku dari program lain dengan menambahkan langkahlangkah sejenis. Contoh paling sederhana dari proses rekursi adalah menghitung nilai faktorial dari bilangan bulat. Nilai faktorial, secara rekursif dapat ditulis sebagai : 0! = 1 N! = N x (N-1)!, Untuk N > 0 yang secara notasi pemrograman bisa ditulis sebagai: FAKTORIAL (0) = 1 1) FAKTORIAL (N) = N * FAKTORIAL (N-1) 2) Persamaan 2) di atas merupakan contoh hubungan rekurens (recurrence relation), yang berarti bahwa nilai suatu fungsi dengan argumen tertentu bisa dihitung dari fungsi yang sama dengan argumen yang lebih kecil. Persamaan 1) yang tidak bersifat rekursif, disebut nilai awal. Setiap fungsi rekursi paling sedikit mempuyai 1 (satu) nilai awal; jika tidak, fungsi tersebut tidak bisa dihitung secara eksplisit.

2.2.2

Proses Rekursif

Untuk memahami proses rekursif yang terjadi dalam sebuah fungsi rekursif, perhatikan contoh sederhana di bawah ini. Contoh di bawah ini menyajikan satu fungsi untuk menghitung harga pangkat suatu nilai bilangan bulat misalnya 35, berdasarkan hubungan rekurens seperti dijelaskan diatas, maka proses rekursif akan tampak pada gambar berikut ini :

IF-UTAMA

Versi/Revisi : 0/1

Halaman : 2-1

Modul Praktikum Algoritma & Pemrograman II

35 = 3 34 = 3 81 = 243
34 = 3 33 = 3 27 = 81 33 = 3 32 = 3 9 = 27 32 = 3 31 = 3 3 = 9 31 = 3 30 = 3 1 = 3 30 = 1
Gambar 2.1 Ilustrasi Penghitungan pangkat secara rekursif Dari definisi tersebut, statemen pertama menunjukkan nilai yang utama dari fungsi, dan statemen kedua menunjukan perulangan penurunan dari n yaitu n-1. Selain fungsi, prosedur juga dapat dilakukan operasi rekursif. Sebagai contoh penggunaan proses rekursif pada prosedur adalah prosedur pencarian biner (binary search). Dalam beberapa hal rekursif kurang efisien dibandng proses iterasi. Dalam artian pemecahan secara rekursif dan secara iterasi mempunyai keuntungan dan kekurangan yang bisa saling diperbandingkan. Adalah cukup sulit untuk menentukan mana yang paling sederhana, paling jelas, paling efisien dan paling mudah dibanding yang lain. Bisa ditambahkan, pemilihan secara iteratif maupun rekursif boleh dikatakan merupakan kesenangan seorang programmer sesuai dengan keinginannya.

Tabel 2.1. Algoritma & Program Berdasarkan Gambar 2.1 Algoritma Bahasa C atau C++
Judul : Algoritma Pangkat secara rekursif Kamus : X,Y : Integer Algoritma: {fungsi pangkat secara rekursif} FUNCTION Pangkat(X:Integer,Y:Integer) Integer IF Y = 0 THEN Pangkat 1 ELSE Pangkat X * Pangkat(X,Y1) ENDIF END FUNCTION {Bagian Pemanggil} INPUT X, Y OUTPUT Pangkat(X,Y) //Program Pangkat rekursif #include <stdio.h> #include <stdlib.h> int X,Y; secara

// fungsi pangkat secara rekursif long int Pangkat(int X, int Y){ if(Y==0){ return 1; else{ return X * Pangkat(X,Y--); } } int main(){ scanf(%d %d, &X, &Y); printf(%d pangkat %d %ld\n,X,Y,Pangkat(X,Y)); system(pause); return 0; }

2.3
1. 2.

TUGAS PENDAHULUAN IV
Jelaskan teknik pemrograman rekursif ! Jelaskan Perbandingan Rekursif dan Iterasi !
Versi/Revisi : 0/1 Halaman : 2-2

IF-UTAMA

Modul Praktikum Algoritma & Pemrograman II

3.

4.

Buatlah algoritma dengan teknik rekursif untuk menyelesaian masalah (beserta outputnya) berikut : a. Mencari Permutasi suatu kata b. Membuat segi tiga Pascal, dengan syarat C(n,0) = 1 dan C(n,n) = 1 untuk n>=0 C(n,k)=C(n-1,k)+C(n-1,k-1) untuk n>k>0 Kemudian konversi algoritma tersebut ke dalam bahasa C/C++ dengan menggunakan template program 2-1 di bawah ini Buat program di bawah ini, dan lengkapi dengan hasil konversi algoritma pada nomor 3 ke dalam bahasa C/C++.

Program 2-1
//fungsi untuk menghitung factorial secara rekursif long int Faktorial(int N){ if(N==0) return 1; else return N*Faktorial(N-1); //prosedur untuk (a) void Tower_Hanoi(int CakramGerak, int CakramKe, char TiangA, char TiangB, char TiangC) { if (CakramKe>0) { Tower_Hanoi (CakramGerak,CakramKe-1,TiangA,TiangC,TiangB); CakramGerak++; cout<<"Pindahkan Cakram Nomor : "<<CakramKe<<" dari Tiang "<<TiangA<<" ke Tiang "<<TiangC<<" ["<<TiangA<<" --> "<<TiangC<<"]"<<endl; Tower_Hanoi (CakramGerak,CakramKe-1,TiangB,TiangA,TiangC);} } //prosedur untuk (b) void CariGheto(int A[10], int Awal, int Akhir, int Tengah, int Data_Cari, int Ketemu) { if (Awal > Akhir) { Ketemu := 0;} else { Tengah := (Awal + Akhir) div 2; if (Data_Cari < A[Tengah]){ CariGheto (A, Awal, Tengah 1, Tengah, Ketemu);} else { if (Data > A[Tengah]) { CariGheto (A,Tengah + 1, Akhir, Tengah, Ketemu);} else { Ketemu := 1;} } //prosedur input data dalam array A[10] void InputGheto(int A[10],int N){ for(int i=0;i<=10;i++){ scanf(%d,&a[i]);} } //bagian pemanggil/program utama int main(){ int pilih; printf(1. Hitung N!\n); printf(2. Tower of Hanoi\n); printf(3. Pencarian\n); printf(4. Permutasi\n);//kasus no 3a printf(5. Segitiga Pascal\n);//kasus no3b

IF-UTAMA

Versi/Revisi : 0/1

Halaman : 2-3

Modul Praktikum Algoritma & Pemrograman II

printf(0. Exit\n); printf(Masukan pilihan anda [0|1|2|3|4|5] : );scanf(%d,&pilih); switch(pilih){ case 1 : { int N; scanf(%d,&N); printf(%d! = %.0f\n,N,Faktorial(N); break();} case 2 : {.......(c);break();} case 3 : {.......(d);break();} case 4 : {.......(e);break();} case 5 : {.......(f);break();} default : {.......(g);break();} } system(pause); retrun 0; }

simpan program 2-1 ke dalam folder anda. Nama file dibuat dengan format <digit NPM paling belakang tanpa 06><no urut modul>, contoh untuk NPM 06010U001 dan program modul 1 maka nama filenya adalah 10U0012.cpp. Bawa folder tersebut pada saat praktikum (pertemuan 7), copy-kan ke komputer dan selanjutnya ikuti instruksi dosen dan asisten praktikum

2.4

LATIHAN PRAKTIKUM IV

Berdasarkan program 2-1 di atas 1. Lengkapi program yang masih kosong (a) (g) 2. Tulis hasil analisisnya serta hasil running program tersebut !

2.5

TUGAS RUMAH IV

Berdasarkan program Latihan Praktikum IV di atas buat dokumentasinya dalam bentuk laporan hasil praktikum

IF-UTAMA

Versi/Revisi : 0/1

Halaman : 2-4