download

T0616
ALGORITMA DAN PEMROGRAMAN
(10)
SUBANDIJO
UNIVERSITAS BINA NUSANTARA
FAKULTAS ILMU KOMPUTER
JAKARTA, 2005
7/11/2017
T0616 - Algoritma dan Pemrograman
1
FUNGSI REKURSI
(1)
• FUNGSI REKURSI ADALAH FUNGSI YANG
FUNCTION BODY-NYA MEMUAT PERNYATAAN
YANG MEMANGGIL DIRINYA SENDIRI.
• FUNGSI REKURSI BERMANFAAT UNTUK
PEMECAHAN MASALAH JIKA MASALAH TERSEBUT DAPAT DIDEFINISIKAN SECARA REKURSI.
• IDE DASAR REKURSI ADALAH INDUKSI
MATEMATIKA.
7/11/2017
T0616 - Algoritma dan Pemrograman
2
FUNGSI REKURSI
(2)
• CONTOH:
• N!, DIBACA N FAKTORIAL, DIDEFINISIKAN SEBAGAI
BERIKUT:
N!=1
N ! = N * (N-1) !
7/11/2017
UNTUK N = 0
UNTUK N > 0.
T0616 - Algoritma dan Pemrograman
3
TRACING FUNGSI REKURSI
5!
(5 * 4!)
(5 * (4 *3!))
(5 * (4 * (3 * 2!)))
(5 * (4 * (3 * (2 * 1!))))
(5 * (4 * (3 * (2 * (1 * 0!)))))
(5 * (4 * (3 * (2 * (1 * 1)))))
(5 * (4 * (3 * (2 * 1))))
(5 * (4 * (3 * 2)))
(5 * (4 * 6 ))
(5 * 24)
120
7/11/2017
T0616 - Algoritma dan Pemrograman
4
KOMPONEN FUNGSI REKURSI
• FUNGSI REKURSI MEMPUNYAI DUA KOMPONEN
YAITU:
• BASE CASE: MENGEMBALIKAN NILAI TANPA MELAKUKAN PEMANGGILAN REKURSI BERIKUTNYA.
• REDUCTION STEP: MENGHUBUNGKAN FUNGSI DI
SUATU NILAI INPUT KE FUNGSI YANG DIEVALUASI
DI NILAI INPUT YANG LAIN. SEKUEN NILAI INPUT
HARUS KONVERGEN KE BASE CASE.
• FUNGSI FAKTORIAL
• BASE CASE : N = 0
• REDUCTION STEP: F(N) = N * F(N-1)
7/11/2017
T0616 - Algoritma dan Pemrograman
5
REKURSI ALGORITMA
E(UCLIDEAN)
• ALGORITMA E(UCLIDEAN) SUDAH BERUMUR
LEBIH DARI 2000 TAHUN DAN MERUPAKAN
SALAH SATU ALGORITMA MODERN YANG
PALING TUA.
int gcd (int m, int n) {
if(m==0) return m;
return gcd(n, m % n);
}
7/11/2017
T0616 - Algoritma dan Pemrograman
6
REKURSI VS ITERASI
• FAKTORIAL MENGGUNAKAN REKURSI
long faktor(int n) {
if(n==0)
return (1);
else
return(n * faktor(n-1));
}
Mengapa
faktor() bertipe
long ?
7/11/2017
• FAKTORIAL MENGGUNAKAN ITERASI
long faktor(int n) {
long i, fak = 1;
for(i=1; i<=n; i++)
fak *= i;
return (fak);
}
Mengapa nilai awal
fak = 1?
T0616 - Algoritma dan Pemrograman
7
KEKURANGAN FUNGSI REKURSI
• MESKIPUN PROGRAM REKURSI BISA LEBIH
PENDEK TETAPI FUNGSI REKURSI MEMBUTUHKAN:
– MEMORI YANG LEBIH BESAR KARENA PERLU
MEMORI EKSTRA UNTUK ACTIVATION
RECORD STACK.
– WAKTU LEBIH LAMA KARENA PERLU
MENJEJAKI SETIAP PEMANGGILAN REKURSI
MELALUI ACTIVATION RECORD STACK.
7/11/2017
T0616 - Algoritma dan Pemrograman
8
KAPAN MENGGUNAKAN FUNGSI
REKURSI
• SECARA UMUM GUNAKAN PENYELESAIAN
SECARA REKURSI JIKA:
• PENYELESAIAN SULIT DILAKUKAN SECARA
ITERASI.
• EFISIENSI SECARA REKURSI SUDAH MEMADAI.
• EFISIENSI BUKAN MASALAH DIBANDINGKAN
DENGAN KEJELASAN PROGRAM.
• PEMBOROSAN (REDUNDANCY) MEMORI DAPAT
TERJADI DALAM PENYELESAIAN MASALAH
SECARA REKURSI.
7/11/2017
T0616 - Algoritma dan Pemrograman
9
BILANGAN FIBONACCI
• SEKUEN BILANGAN 0, 1, 1, 2, 3, 5, 8, 13, 21,34, 55,
89, 134, … DISEBUT BILANGAN FIBONACCI.
HUBUNGAN ANTARA SATU SUKU DENGAN SUKU
BERIKUTNYA DIDEFINISIKAN SECARA REKURSI
SBB:
FIB(N) = N
JIKA N = 0 ATAU 1
FIB(N) = FIB(N-2) + FIB(N-1) JIKA N >= 2.
D
7/11/2017
T0616 - Algoritma dan Pemrograman
10
BILANGAN FIBONACCI
int Fib(int n) {
int f;
if(n==0) f = 0;
else if(n==1) f = 1;
else f = Fib(n-2) + Fib(n-1);
return f;
}
7/11/2017
T0616 - Algoritma dan Pemrograman
FUNGSI FIB() DISAMPING DITULIS SECARA
REKURSI DAN
DISEBUT SEBAGAI SLOW_FIB()
TULISLAH
FAST_FIB()
MENGGUNAKAN
ITERASI.
11
PEMBOROSAN MEMORI UNTUK
N=4
FIB (4)
FIB (3)
FIB (2)
FIB (1)
7/11/2017
FIB (2)
FIB (1)
FIB (1)
FIB (0)
FIB (0)
T0616 - Algoritma dan Pemrograman
12
MENARA HANOI
(1)
• MEMINDAHKAN N PIRINGAN DARI PILAR KIRI KE
KANAN DENGAN PILAR TENGAH SEBAGAI
ANTARA. PIRINGAN DI SEBELAH KIRI TERSUSUN
SEDEMIKIAN RUPA SEHINGGA MENYERUPAI
MENARA YAITU PIRINGAN YANG LEBIH KECIL
BERADA DI ATAS PIRINGAN YANG LEBIH BESAR.
SELAMA PROSES PEMINDAHAN POLA SUSUNAN
MENARA HARUS SELALU DIJAGA.
7/11/2017
T0616 - Algoritma dan Pemrograman
13
MENARA HANOI
(2)
• RULE:
• PINDAHKAN PIRINGAN SATU PER SATU.
• SUATU PIRINGAN TIDAK BOLEH BERADA DI
ATAS PIRINGAN YANG LEBIH KECIL.
7/11/2017
T0616 - Algoritma dan Pemrograman
14
MENARA HANOI
(3)
• ALGORITMA DENGAN TEKNIK WORKING
BACKWARD.
• PINDAHKAN (N-1) PIRINGAN ATAS KE PILAR ANTARA.
• PINDAHKAN PIRINGAN TERAKHIR KE PILAR TUJUAN.
• ULANGI LANGKAH 1 DAN 2 HINGGA SELESAI.
• DISEBUT TEKNIK WORKING BACKWARD KARENA
PROSES BERJALAN MUNDUR YAITU:
• UNTUK MEMINDAHKAN N PIRINGAN, PIKIRKAN DULU
CARA MEMINDAHKAN (N-1) PIRINGAN.
• ULANGI LANGKAH DI ATAS UNTUK (N-1), (N-2) …
• PINDAHKAN SATU PIRINGAN YAITU PIRINGAN TERAKHIR.
7/11/2017
T0616 - Algoritma dan Pemrograman
15
MENARA HANOI
(4)
menHanoi(int n, char awal, char akhir, char antara) {
if(n==1) printf(“Pindahkan 1 dari %c ke %c\n”, awal,
akhir);
else {
menHanoi(n-1, awal, antara, akhir);
printf(“Pindahkan %d dari %c ke %c\n”, n, awal,
akhir);
TULIS FUNGmenHanoi(n-1, antara, akhir, awal);
SI MAIN()}
NYA.
}
7/11/2017
T0616 - Algoritma dan Pemrograman
16
MENARA HANOI
(3)
7/11/2017
T0616 - Algoritma dan Pemrograman
17
THE END
“...ALL YOU NEED IS LOVE…”
7/11/2017
T0616 - Algoritma dan Pemrograman
18