S1 Teknik Informatika-Unijoyo 1
Algoritma Pemrograman
Pertemuan Ke-14
(Rekursi)
S1 Teknik Informatika-Unijoyo 3 Algoritma rekursi adalah algoritma yang merupakan proses dalam subprogram (dapat berupa fungsi atau prosedur) yang memanggil dirinya sendiri
Tidak semua bahasa tingkat tinggi menyediakan kemampuan untuk melakukan algoritma rekursi. Salah satu bahasa tingkat tinggi yang dapat melakukan rekursi adalah Bahasa Pascal
Proses rekursi untuk beberapa kasus merupakan algoritma yang baik dan dapat membuat pemecahan masalah lebih mudah. Akan tetapi proses ini banyak menggunakan memori, dikarenakan setiap kali suatu subprogram dipanggil, maka diperlukan sejumlah tambahan memori
Dalam menulis suatu fungsi atau prosedur rekursi, yang perlu diperhatikan adalah fungsi atau prosedur tersebut harus mengandung suatu kondisi akhir dari proses rekursi. Kondisi ini diperlukan untuk mencegah terjadinya proses rekursi yang tidak berujung (indefinite), yaitu proses rekursi akan terus dilakukan tanpa berhenti
Pendahuluan
Contoh 1: Proses rekursi yang tidak pernah berakhir (karena tidak mengandung kondisi untuk mengakhirkan rekursi tersebut)
Algoritma REKURSI_TANPA_AKHIR
{ Rekursi yang tidak berujung akhir } DEKLARASI (* Program Utama *)
{ Tidak ada }
procedure Rekursi
{ Menampilkan tulisan “Informatika” secara terus menerus, karena tidak mengandung kondisi pengakhiran rekursi }
DEKLARASI (* Prosedur *) { Tidak ada }
DESKRIPSI : (* Prosedur *) write(‘Informatika ’) Rekursi
DESKRIPSI : (* Program Utama *) Rekursi
Program REKURSI_TANPA_AKHIR; procedure Rekursi;
Begin
Write(‘Informatika ’);
Rekursi;
End;
Begin Rekursi;
S1 Teknik Informatika-Unijoyo 5 • Bila program dijalankan, maka proses rekursi akan terus dijalankan
tanpa berhenti sebagai berikut:
Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika Informatika . . .
• Kondisi pengakhiran rekursi dapat dilakukan dengan menggunakan struktur penyeleksian kondisi. Rekursi akan dihentikan bila kondisi telah memenuhi syarat
Contoh 1: Hasil Keluaran
Contoh 2: Proses rekursi sebanyak 5 kali, yaitu dengan menyeleksi kondisi dari peubah ulang sampai dengan bernilai 5
Algoritma REKURSI_DENGAN_AKHIR { Rekursi yang tidak berujung akhir } DEKLARASI (* Program Utama *)
ulang : integer
procedure Rekursi
{ Menampilkan tulisan “Informatika” sebanyak 5 kali }
DEKLARASI { Tidak ada } DESKRIPSI : (* Prosedur *) if ulang < 5 then
write(‘Informatika ’) ulang ← ulang + 1 Rekursi
endif
DESKRIPSI : (* Program Utama *) ulang ← 0
Rekursi
Program REKURSI_DENGAN_AKHIR; Var
ulang : integer;
procedure Rekursi;
Begin
if ulang < 5 then begin
S1 Teknik Informatika-Unijoyo 7 Contoh 3: Prosedur Deret untuk menampilkan suatu deret bilangan bulat N dari 0 sampai dengan 5
Algoritma DERET
{ Menampilkan deret bilangan bulat N dari 0 sampai 10 }
DEKLARASI (* Program Utama *) N : integer
procedure Deret(output N : word) DEKLARASI (* Prosedur *)
{ Tidak ada }
DESKRIPSI : (* Prosedur *) write(N)
if n < 5 then Deret(N+1) endif
DESKRIPSI : (* Program Utama *) N ← 0
• Bila program dijalankan didapatkan hasil:
0 1 2 3 4 5
Faktorial adalah 1x2x3x4x...N (dengan asumsi N lebih besar dari 3) dan dapat dirumuskan dengan:
N! = N * (N-1) * (N-2) * ... * 1
Perumusan ini dapat didefinisikan secara rekursi sebagai berikut:
N! = N * (N-1)!
Misal, rekursi nilai 4!Dapat dihitung kembali sebesar 4 * 3!, sehingga 5! menjadi:
5! = 5 * 4 * 3!
Secara rekursi nilai 3! adalah 3 * 2!, sehingga nilai 5!
menjadi:
5! = 5 * 4 * 3 * 2 !
Secara rekursi nilai dari 2!adalah 2 * 1, sehingga akhirnya nilai 5!adalah:
5! = 5 * 4 * 3 * 2 * 1 = 120
S1 Teknik Informatika-Unijoyo 9 Proses rekursi untuk menghitung N!
N! = 1 untuk N <= 1 N! = N * (N-1)! untuk N > 1
Algoritma HITUNG_FAKTORIAL;
{Menghitung faktorial suatu nilangan bulat} DEKLARASI (* Program Utama *)
N : integer
function FAKTORIAL(input N:integer)→→→→ integer
{ mengembalikan nilai n! } DEKLARASI (* Fungsi *) { tidak ada }
DESKRIPSI: (* Fungsi *) if N ≤ 1 then
return 1 else
return n*FAKTORIAL(n-1) endif
DESKRIPSI: (* Program Utama *) write(‘Berapa faktorial ?’) read(N)
write(‘Faktorial = ‘,FAKTORIAL(N))
PROGRAM HITUNG_FAKTORIAL; var
N : integer;
function Faktorial(N: integer): integer;
begin
if N <= 1 then
Faktorial := 1
else
Faktorial := N * Faktorial(N-1);
end;
begin
write(‘Berapa faktorial ?’);
readln(N);
write(‘Faktorial= ‘,Faktorial(N));
end.
Permasalahan menara Hanoi adalah memindahkan sejumlah piringan dari satu menara ke menara yang lain
Pemindahan piringan dilakukan satu demi satu dan tidak boleh ada piringan yang lebih kecil yang berada di bawah piringan yang lebih besar. Untuk itu disediakan sebuah menara lagi untuk bantuan pemindahan. Jadi dipergunakan tiga buah menara, yaitu:
1.menara sumberyang berisi piringan yang akan dipindahkan (menara A)
2.menara tujuanpiringan (menara C) 3.menara untuk bantuan(menara B)
S1 Teknik Informatika-Unijoyo 11 Permasalahan Menara Hanoi:
Menara A sebagai sumber Menara C sebagai tujuan Menara B sebagai bantuan
Ilustrasi Menara Hanoi [1]
Anggaplah jumlah piringan yang akan dipindahkan adalah N piringan
Permasalahan ini dapat dipecahkan dengan langkah sebagai berikut:
Jika N = 1, maka langsung pindahkan saja piringan dari menara Ake menara Cdan selesai
Pindahkan N-1piringan dari menara Ake menara B, menggunakan menara Csebagai menara bantuan Pindahkan sisa sebuah piringan di Alangsung ke C
Akhirnya pindahkan sisa sejumlah N-1 piringan di menara B ke menara Cdengan menggunakan bantuan menara A Pemindahan N-1 piringan tersebut dilakukan satu per satu dan tidak sekaligus. Proses pemindahan merupakan proses yang berulang-ulang (rekursi)
S1 Teknik Informatika-Unijoyo 13 Algoritma MENARA_HANOI
{ Pemindahan piringan pada permasalahan Menara Hanoi } DEKLARASI (* Program Utama *)
J, L : integer A, B, C: char
procedure MenaraHanoi(input J : integer, input A,C,B : char; output L : integer)
DEKLARASI (* Prosedur *) { tidak ada }
DESKRIPSI: (* Prosedur *) if J = 1 then
L ←L + 1
write(‘Langkah : ‘,L,’ ‘)
write(‘Pindahkan piringan 1 dari menara ‘,A,’ ke menara ‘,C) else
(* Pindahkan N-1 piringan dari menara A ke B menggunakan menara C*)
MenaraHanoi(J-1,A,B,C,L) L ←L + 1
write(‘Langkah : ‘,L,’ ‘)
write(‘Pindahkan piringan ’,J,’ dari menara ‘,A,’ ke menara ‘,C) (* Pindahkan N-1 piringan dari menara B ke C menggunakan menara A *)
MenaraHanoi(J-1,B,C,A,L) endif
DESKRIPSI: (* Program Utama *) write(‘Jumlah Piringan ? ’) readln(J)
Procedure MenaraHanoi(J:integer; A,C,B:char; Var L:integer); begin
if J = 1 then begin
L := L + 1;
write(‘Langkah : ‘,L,’ ‚);
writeln(‘Pindahkan piringan 1 dari menara ‘,A,’ ke menara ‘,C);
end else begin
(* Pindahkan N-1 piringan dari menara A ke B menggunakan menara C*)
MenaraHanoi(J-1,A,B,C,L); L := L + 1;
write(‘Langkah : ‘,L,’ ‘);
writeln(‘Pindahkan piringan ’,J,’ dari menara ‘,A,’ ke menara ‘,C); (* Pindahkan N-1 piringan dari menara B ke C menggunakan menara A *)
MenaraHanoi(J-1,B,C,A,L);
end;
end;
begin
S1 Teknik Informatika-Unijoyo 15
Jumlah piringan ? 4
Langkah: 1 Pindahkan piringan 1 dari menara A ke menara B Langkah: 2 Pindahkan piringan 2 dari menara A ke menara C Langkah: 3 Pindahkan piringan 1 dari menara B ke menara C Langkah: 4 Pindahkan piringan 3 dari menara A ke menara B Langkah: 5 Pindahkan piringan 1 dari menara C ke menara A Langkah: 6 Pindahkan piringan 2 dari menara C ke menara B Langkah: 7 Pindahkan piringan 1 dari menara A ke menara B Langkah: 8 Pindahkan piringan 4 dari menara A ke menara C Langkah: 9 Pindahkan piringan 1 dari menara B ke menara C Langkah: 10 Pindahkan piringan 2 dari menara B ke menara A Langkah: 11 Pindahkan piringan 1 dari menara C ke menara A Langkah: 12 Pindahkan piringan 3 dari menara B ke menara C Langkah: 13 Pindahkan piringan 1 dari menara A ke menara B Langkah: 14 Pindahkan piringan 2 dari menara A ke menara C Langkah: 15 Pindahkan piringan 1 dari menara B ke menara C
Hasil keluaran untuk 4 piringan dalam menara Hanoi
• Algoritma rekursi adalah algoritma yang merupakan proses
dalam subprogram (dapat berupa fungsi atau prosedur) yang memanggil dirinya sendiri
• Yang perlu diperhatikan dalam penulisan fungsi atau
prosedur rekursi adalah fungsi atau prosedur tersebut harus mengandung suatu kondisi akhir dari proses rekursi.
Kondisi ini diperlukan untuk mencegah terjadinya proses rekursi yang tidak berujung (indefinite), yaitu proses rekursi akan terus dilakukan tanpa berhenti
• Contoh permasalahan yang dapat diselesaikan dengan
lebih baik dan lebih mudah dengan menggunakan algoritma rekursi adalah Permasalahan Faktorial dan Menara Hanoi
S1 Teknik Informatika-Unijoyo 17