Pendahuluan Faktorial Menara Hanoi

  Algoritma Pemrograman Pertemuan Ke-14 (Rekursi) :: ::

  S1 Teknik Informatika-Unijoyo

  1

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 1: Proses rekursi yang tidak pernah berakhir (karena tidak mengandung kondisi untuk mengakhirkan rekursi tersebut)

Algoritma REKURSI_TANPA_AKHIR Program REKURSI_TANPA_AKHIR;

  { Rekursi yang tidak berujung akhir } procedure Rekursi ;

  DEKLARASI (* Program Utama *)

Begin

  { Tidak ada } Write(‘Informatika ’); Rekursi ; procedure Rekursi

  End; { Menampilkan tulisan “Informatika” secara terus menerus, karena tidak

Begin

  mengandung kondisi pengakhiran rekursi Rekursi ;

  } End. DEKLARASI (* Prosedur *) { Tidak ada } DESKRIPSI : (* Prosedur *) write(‘Informatika ’)

Rekursi

  DESKRIPSI : (* Program Utama *)

Rekursi

  S1 Teknik Informatika-Unijoyo

  4

  • 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

Algoritma REKURSI_DENGAN_AKHIR

  Rekursi ; End.

  ulang := 0;

  

Rekursi ;

end; end;

  ulang := ulang + 1;

  

procedure Rekursi ;

Begin if ulang < 5 then begin write(‘Informatika ’);

  ulang : integer;

  endif DESKRIPSI : (* Program Utama *) ulang ← 0

  { 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

  6 Contoh 2: Proses rekursi sebanyak 5 kali, yaitu dengan menyeleksi kondisi dari peubah ulang sampai dengan bernilai 5

  Contoh 1: Hasil Keluaran S1 Teknik Informatika-Unijoyo

  5

  S1 Teknik Informatika-Unijoyo

Begin

Rekursi

Rekursi Program REKURSI_DENGAN_AKHIR; Var

  Contoh 3: Prosedur Deret untuk menampilkan suatu deret bilangan bulat N dari 0 sampai dengan 5

Algoritma DERET Program DERET_BILANGAN; var

  { Menampilkan deret bilangan bulat N

  N : integer;

  dari 0 sampai 10 } DEKLARASI (* Program Utama *) procedure Deret (N : integer);

  N : integer begin

write(N:3);

procedure Deret (output N : word) if N < 5 then DEKLARASI (* Prosedur *) Deret (N+1); end;

  { Tidak ada } DESKRIPSI : (* Prosedur *) begin write(N)

  N := 0;

  if n < 5 then Deret (N);

  Deret (N+1) end. endif

  Bila program dijalankan

  • DESKRIPSI : (* Program Utama *)

  didapatkan hasil:

  N ← 0

Deret (N) 0 1 2 3 4 5

  S1 Teknik Informatika-Unijoyo

  7 Faktorial 1x2x3x4x...N N

  Faktorial adalah (dengan asumsi 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)! 4! 4 * 3!

  Misal, rekursi nilai Dapat dihitung kembali sebesar ,

  5!

  sehingga menjadi:

  5! = 5 * 4 * 3! 3! 3 * 2! 5!

  Secara rekursi nilai adalah , sehingga nilai menjadi:

  5! = 5 * 4 * 3 * 2 ! 2! 2 * 1

  Secara rekursi nilai dari adalah , sehingga akhirnya

  5!

  nilai adalah:

  5! = 5 * 4 * 3 * 2 * 1 = 120 S1 Teknik Informatika-Unijoyo

  8 Proses rekursi untuk menghitung N!

N! = 1 untuk N <= 1 N! = N * (N-1)! untuk N > 1 Algoritma HITUNG_FAKTORIAL; PROGRAM HITUNG_FAKTORIAL;

  {Menghitung faktorial suatu nilangan bulat} var

  integer;

  N : DEKLARASI (* Program Utama *) N : integer

  function Faktorial (N: integer):

  integer; → → →

  function FAKTORIAL (input N:integer)integer begin

  { mengembalikan nilai n! }

  if N &lt;= 1 then

  DEKLARASI (* Fungsi *) Faktorial := 1

  { tidak ada }

  else

  DESKRIPSI: (* Fungsi *) Faktorial := N * Faktorial (N-1); if N ≤ 1 then

  end;

  return 1 else

  begin

  return n* FAKTORIAL (n-1) write(‘Berapa faktorial ?’); endif readln(N);

  write(‘Faktorial= ‘, Faktoria l (N)); end.

  DESKRIPSI: (* Program Utama *) write(‘Berapa faktorial ?’) read(N) write(‘Faktorial = ‘, FAKTORIAL (N))

  S1 Teknik Informatika-Unijoyo

  9 Manara 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

  10 S1 Teknik Informatika-Unijoyo

  11 Permasalahan Menara Hanoi:

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

  Ilustrasi Menara Hanoi [1] S1 Teknik Informatika-Unijoyo

  12 Anggaplah jumlah piringan yang akan dipindahkan adalah

  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

  piringan di menara B ke menara C dengan menggunakan bantuan menara A

  Pemindahan

  piringan tersebut dilakukan satu per satu dan tidak sekaligus. Proses pemindahan merupakan proses yang berulang-ulang (rekursi)

  Ilustrasi Menara Hanoi [2]

N

N-1

N-1

  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

  13 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

  14 Hasil keluaran untuk 4 piringan dalam menara Hanoi

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

  15 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

  16 Daftar Pustaka Jogiyanto HM [1989]. Turbo Pascal, Yogyakarta: Andi Offset. Noor Ifada [2005]. Diktat Matakuliah Algoritma Pemrograman (Hibah Kompetisi A1), Bangkalan: Jurusan Teknik Informatika, Universitas Trunojoyo.

Rinaldi Munir [2003]. Algoritma dan Pemrograman dengan Pascal dan C edisi Kedua, Bandung: Informatika

  S1 Teknik Informatika-Unijoyo

  17