Upload
ilkom12
View
221
Download
1
Embed Size (px)
DESCRIPTION
Analysis Of Algorithm
Citation preview
REKURSIF
REKURSIF
• Rekursif merupakan alat/cara untuk memecahkan masalah dalam suatu fungsi atau procedure yang memanggil dirinya sendiri.
• Definisi menurut Niclaus Wirth :“ An object is said be recursive if it partially
consist or is defines in terms of itself”
• perhitungan matematika ( contoh fungsi factorial dan bilangan Fibonacci)
Algoritma dan Pemrograman II
• Contoh fungsi rekursif misalnya adalah fungsi pangkat, faktorial, dan barisan fibonacci.
• Dalam fungsi pangkat xy , kita tahu bahwa semua bilangan selain 0, jika dipangkatkan dengan 0 nilainya sama dengan 1. Jika x dipangkatkan dengan y, dengan y lebih dari 0, maka hasilnya sama dengan x dikalikan dengan x dipangkatkan y – 1.
Jika dituliskan dalam notasi matematika definisinya adalah sebagai berikut:
Kita lihat di atas pada definisi y > 0, bentuk pemangkatan muncul kembali di sisi kanan. Itulah yang disebut rekursif.
Faktorial
• Fungsi factorial dari bilangan bulat positif n didefinisikan sebagai berikut:
n!= n.(n-1)! , jika n>1n!= 1 , jika n=0, 1
• contoh :3!= 3. 2!3!= 3. 2. 1!3!= 3. 2. 13!= 6
Algoritma dan Pemrograman II
permasalahan faktorial, yang mana kita menghitung hasil faktorial dari sebuah bilangan, yaitu n. Faktorial dari n (ditulis n!), adalah hasil kali dari bilangan tersebut dengan bilangan di bawahnya, di bawahnya hingga bilangan 1. Sebagai contoh, 4! = (4)(3)(2)(1). Salah satu cara untuk menghitung adalah dengan menggunakan loop, yang mengalikan masing-masing bilangan dengan hasil sebelumnya. Penyelesaian dengan cara ini dinamakan iteratif, yang mana secara umum dapat didefinisikan sebagai berikut:
n! = (n)(n-1)(n-2) … (1)
• Cara lain untuk menyelesaikan permasalahan di atas adalah dengan cara rekursi, dimana n! adalah hasil kali dari n dengan (n-1)!. Untuk menyelesaikan (n-1)! adalah sama dengan n!, sehingga (n-1)! adalah n-1dikalikan dengan (n-2)!, dan (n-2)! adalah n-2 dikalikan dengan (n-3)! dan seterusnya sampai dengan n = 1, kita menghentikan penghitungan n! Cara rekursif untuk permasalahan ini, secara umum dapat kita detailkan sebagai berikut:
CONTOH :
Rekursi TailSebuah proses rekursi dikatakan rekursi tail jika pernyataan terakhir yang akan dieksekusi berada dalam tubuh fungsi dan hasil yang kembali pada fungsi tersebut bukanlah bagian dari fungsi tersebut. Ciri fungsi rekursi tail adalah fungsi tersebut tidak memiliki aktivitas selama fase balik. Ciri ini penting, karena sebagian besar kompiler modern secara otomatis membangun kode untuk menuju pada fase tersebut. Ketika kompiler mendeteksi sebuah pemanggilan yang mana adalah rekursi tail, maka kompiler menulis aktivitas yang ada sebagai sebuah record yang dimasukkan ke dalam stack. Kompiler dapat melakukan hal tersebut karena pemanggilan rekursi adalah pernyataan terakhir yang dieksekusi dalam aktivitas yang sedang berlangsung, sehingga tidak ada aktivitas yang harus dikerjakan pada saat pemanggilan kembali.
Pada definisi ini digunakan parameter kedua, yaitu a, yang mana merupakan nilai utama dari penghitungan faktorial secara rekursif. Hal ini mencegah kita untuk mengalikan nilai yang dikembalikan dalam setiap aktivitas dengan n. Dalam masing-masing pemanggilan rekursi kita mendefinisikan a = na dan n = n – 1. Kita melanjutkan sampai n = 1, sebagai kondisi terminal. aktivitas selama fase balik.
* Menghitung sebuah faktorial dengan rekursi tail *
**********************************************************
{
if (n < 0)
return 0;
else if (n == 0)
return 1;
else if (n == 1)
return a;
else
return tail(n-1,n*a);
}
1. int Faktorial(int n)2. {3. if ((n == 0) || (n == 1 ))4. return (1);5. else6. return (n * Faktorial(n-1));7. }• Pada baris 3 dari fungsi diatas,
nilai n dicek sama dengan 0 atau 1, jika ya, maka fungsi mengembalikan nilai 1 {baris 4}, jika tidak, fungsi mengembalikan nilai n * Faktorial (n -1) {baris 6}
• disinilah letak proses rekursif itu, perhatikan fungsi factorial ini memanggil dirinya sendiri tetapi dengan parameter (n-1)
Atau Kita dapat menuliskan fungsi penghitung factorial seperti dibawah ini
Algoritma dan Pemrograman II
Fungsi yang didefinisikan secara rekursif
Langkah-langkah untuk mendefinisikan fungsi dengan domain bilangan cacah:
1.Langkah basis: Definisikan nilai fungsi pada saat nol.
2.Langkah rekursif: Berikan aturan untuk mencari nilai fungsi untuk setiap bilangan bulat berdasarkan nilai fungsi pada bilangan bulat yang lebih kecil.
Definisi seperti itu disebut rekursif atau definisi induktif.
f(0) = 3
f(n + 1) = 2f(n) + 3
Maka
f(0) = 3
f(1) = 2f(0) + 3 = 23 + 3 = 9
f(2) = 2f(1) + 3 = 29 + 3 = 21
f(3) = 2f(2) + 3 = 221 + 3 = 45
f(4) = 2f(3) + 3 = 245 + 3 = 93
Contoh fungsi yang didefinisikan secara rekursif
Bagaimana kita dapat mendefinisikan fungsi faktorial f(n) = n! secara rekursif?
f(0) = 1Karena (n+1)! = n! (n+1) maka
f(n + 1) = (n + 1)f(n)
f(0) = 1f(1) = 1 f(0) = 1 1 = 1f(2) = 2 f(1) = 2 1 = 2f(3) = 3 f(2) = 3 2 = 6f(4) = 4 f(3) = 4 6 = 24
Contoh fungsi yang didefinisikan secara rekursif (2)
Fibonacci
• Deret Fibonacci adalah suatu deret matematika yang berasal dari penjumlahan dua bilangan sebelumnya.
1, 1, 2, 3, 5, 8, 13, 21, …• Rumus Fibonacci :
f(n) = f(n – 1) + f(n – 2)
f(6) = f(6-1) + f(6-2)
8 = 5 + 3
Bilangan Fibonacci
• Fungsi lain yang dapat diubah ke bentuk rekursif adalah perhitungan Fibonacci. Bilangan Fibonacci dapat didefinisikan sebagai berikut:
fn = fn-1 + fn-2 untuk n > 2
f1 = 1
f2 = 1
Berikut ini adalah barisan bilangan Fibonacci mulai dari n=1
1 1 2 3 5 8 13 21 34
Algoritma dan Pemrograman II
Algoritma Fibonacci yang dipakai
Function Fibonacci(input n:integer) integerDeklarasi Lokal {tidak ada}Deskripsi
If (n ==1 || n==2) Then return (l)
Else return (Fibonacci(n-1)+Fibonacci(n-2))
Endif
Algoritma dan Pemrograman II
Contoh
• Untuk ukuran n= 4, proses perhitungan Fibonacci dapat dilakukan sebagai berikut:
f4 = f3+f2
f4 = (f2+f1) + f2
f4 = (1+1) +1
f4 = 3
Algoritma dan Pemrograman II
Kombinasi
Function Kombinasi (input n, r : integer) realDeklarasi If (n < r) Then
return (0) Else
return (Faktorial(n)/Faktorial(r)*Faktorial(n-r)) Endif
Algoritma dan Pemrograman II
Permutasi
Function Permutasi (input n, r : integer) realDeklarasi
{tidak ada} Deskripsi If (n< r) Then
return (0) Else
return (Faktorial(n) / Faktorial(n-r)) Endif
Algoritma dan Pemrograman II
Contoh terkenal: Bilangan Fibonacci
f0 = 0, f1 = 1
fn = fn-1+ fn-2, n=2,3,4,…
f0= 0
f1= 1
f2= f1+ f0= 1 + 0 = 1
f3= f2+ f1= 1 + 1 = 2
f4= f3+ f2= 2 + 1 = 3
f5= f4+ f3= 3 + 2 = 5
f6= f5+ f4= 5 + 3 = 8
Tunjukkan bahwa untuk n 3,fn < n dengan = (1+√5)/2.
Kelebihan dan kelemahan rekursi :
• Kelebihan– solusi sangatlah
efisien– dapat
memecahkan masalah yang sulit dengan tahapan yang mudah dan singkat
• Kelemahan– sulit dipahami– perlu stack besar
(stack overrun)
Latihan1. Jika f suatu fungsi dari himpunan
bilangan Asli ke himpunan bilangan Asli yang memenuhi f(n) + f(n+1) = 2 n^2 , dan f(2)= 8 , maka f(8) = …. ?
2. Buat program untuk menghitung deret S = 1+2+3+4+5+...+n menggunakan function rekursi
3. Buat program untuk menghitung deret S = 2+4+6+8+10+...+2n menggunakan function rekursi
Algoritma dan Pemrograman II
No.1 deret S=1+2+3+4+5+…+n
Function S(input n:integer) integerDeklarasi Lokal {tidak ada}DeskripsiIf (n==1) Then
return (l)Else
return (n + S(n-1))Endif
No.2 deret S=2+4+6+8+10+…+2n
Function S(input n:integer) integerDeklarasi Lokal {tidak ada}DeskripsiIf (n==1) Then
return (2)Else
return (2*n + S(n-1))Endif
No. 1 dalam bhs C++ (lengkap)#include<iostream.h>int S(int n);main(){ int n; cout << “Masukkan n = “; cin >> n; cout << “Deret S=1+2+3+4+5+...+n \n”; cout << “Jumlah deret S = “ << S(n);}int S(int n){
if (n == 1) return (1);
else return (n + S(n-1));
}