You are on page 1of 20

Algoritma Pemrograman

Pertemuan Ke-14
(Rekursi)

:: Noor Ifada ::

S1 Teknik Informatika-Unijoyo 1
Sub Pokok Bahasan
Pendahuluan
Faktorial
Menara Hanoi

S1 Teknik Informatika-Unijoyo 2
Pendahuluan
• 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
S1 Teknik Informatika-Unijoyo 3
• Contoh berikut merupakan 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

S1 Teknik Informatika-Unijoyo 4
• Bila program ini dijalankan, maka proses
Program REKURSI_TANPA_AKHIR; rekursi akan terus dijalankan tanpa
procedure Rekursi; berhenti sebagai berikut:
Begin Informatika Informatika Informatika
Write(‘Informatika ’); Informatika Informatika Informatika
Rekursi; Informatika Informatika Informatika
End; Informatika Informatika Informatika
Informatika Informatika Informatika
Begin Informatika Informatika Informatika
Rekursi;
Informatika Informatika Informatika
Informatika Informatika Informatika
End. 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

S1 Teknik Informatika-Unijoyo 5
• Contoh: Proses rekursi ini akan dilakukan
sebanyak 5 kali, yaitu dengan menyeleksi
kondisi dari peubah ulang sampai dengan
bernilai 5 sebagai berikut:
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

S1 Teknik Informatika-Unijoyo 6
Program REKURSI_DENGAN_AKHIR;
Var • Bila program
ulang : integer;
dijalankan:
procedure Rekursi;
Begin
Informatika
if ulang < 5 then Informatika
begin
write(‘Informatika ’);
Informatika
ulang := ulang + 1; Informatika
Rekursi;
end; Informatika
end;

Begin
ulang := 0;
Rekursi;
End.

S1 Teknik Informatika-Unijoyo 7
• Contoh: Prosedur Deret ini digunakan untuk
menampilkan suatu deret bilangan bulat N
dari 0 sampai dengan 5 sebagai berikut:
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
Deret(N)

S1 Teknik Informatika-Unijoyo 8
Program DERET_BILANGAN;
var • Pada prosedur tampak terjadi
N : integer;
proses rekursi yaitu bila nilai
procedure Deret(N : integer); N masih lebih kecil dari 5,
begin
write(N:3); maka prosedur kembali
if N < 5 then
Deret(N+1);
dipanggil oleh prosedur itu
end; sendiri dengan mengirimkan
begin
parameter nilai N sebelumnya
N := 0; ditambahkan dengan 1
Deret(N);
end. • Bila program dijalankan
didapatkan hasil:
0 1 2 3 4 5

S1 Teknik Informatika-Unijoyo 9
Faktorial
• 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 10
• Algoritma rekursif untuk menghitung N!
adalah sebagai berikut:
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))

S1 Teknik Informatika-Unijoyo 11
• Bila program ini dijalankan:
PROGRAM HITUNG_FAKTORIAL; Berapa Faktorial? 5
var Faktorial = 120
N : integer;
• Proses rekursi harus
function Faktorial(N : integer) : integer; mempunyai kondisi terminasi
begin (akhir dari proses rekursi).
if N <= 1 then Kondisi terminasi pada
Faktorial := 1
else program faktorial ini terletak
Faktorial := N * Faktorial(N-1); pada penyeleksian kondisi
end; bila nilai N lebih kecil atau
sama dengan 1 sebagai
begin
write(‘Berapa faktorial ?’);
berikut :
readln(N); If N <= 1 then
write(‘Faktorial = ‘,Faktorial(N)); Hasil := 1
end.
• Nilai dari N ini tidak akan
bernilai 0, karena setelah
nilai N menjadi 1, proses
rekursi akan diakhiri, kecuali
bila akan dihitung sebesar
0!. Nilai 0! adalah 1. Dengan
demikian proses rekursi ini
dapat didefinisikan :
N! = 1 untuk N <= 1
N! = N * (N-1)! untuk N > 1

S1 Teknik Informatika-Unijoyo 12
Menara Hanoi
• Permasalahan yang merupakan proses rekursi yang
terkenal adalah menara Hanoi. 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 sumber yang berisi piringan yang akan dipindahkan
(menara A)
2. menara tujuan piringan (menara C)
3. menara untuk bantuan (menara B)

S1 Teknik Informatika-Unijoyo 13
A B C

Permasalahan Menara Hanoi:


– Menara A sebagai sumber
– Menara C sebagai tujuan
– Menara B sebagai bantuan

S1 Teknik Informatika-Unijoyo 14
• 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 A ke menara C dan selesai
• Pindahkan N-1 piringan dari menara A ke menara
B, menggunakan menara C sebagai menara
bantuan
• Pindahkan sisa sebuah piringan di A langsung ke
C
• Akhirnya pindahkan sisa sejumlah N-1 piringan di
menara B ke menara C dengan 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 15
• Solusi Algoritma untuk permasalahan menara Hanoi:
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)
L ← 0
A ← ‘A’ {menara sumber}
B ← ‘B’ {menara bantuan}
C ← ‘C’ {menara tujuan}
MenaraHanoi(J,A,C,B,L)
S1 Teknik Informatika-Unijoyo 16
Program MENARA_HANOI;
var
J, L : integer;
A, B, C: char;
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
write(‘Jumlah Piringan ? ’);readln(J);
L := 0;
A := ‘A’; {menara sumber}
B := ‘B’; {menara bantuan}
C := ‘C’; {menara tujuan}
MenaraHanoi(J,A,C,B,L);
end.

S1 Teknik Informatika-Unijoyo 17
• Bila program ini dijalankan untuk memindahkan 4 piringan
sebagai berikut:
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

S1 Teknik Informatika-Unijoyo 18
Summary
• 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 19
Daftar Pustaka
• Jogiyanto HM [1989]. Turbo Pascal, Andi
Offset, Yogyakarta.
• Noor Ifada, ST [2005]. Diktat Matakuliah
Algoritma Pemrograman, Hibah Kompetisi
A1, Jurusan Teknik Informatika, Universitas
Trunojoyo.
• Rinaldi Munir [2003]. Algoritma dan
Pemrograman dengan Pascal dan C edisi
Kedua, Penerbit Informatika, Bandung.

S1 Teknik Informatika-Unijoyo 20

You might also like