30
REKURSIF

Rekursif

  • Upload
    ilkom12

  • View
    221

  • Download
    1

Embed Size (px)

DESCRIPTION

Analysis Of Algorithm

Citation preview

Page 1: Rekursif

REKURSIF

Page 2: 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

Page 3: Rekursif

• 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.

Page 4: Rekursif

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.

Page 5: 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

Page 6: Rekursif

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)

Page 7: Rekursif

• 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:

Page 8: Rekursif

CONTOH :

Page 9: Rekursif
Page 10: Rekursif
Page 11: Rekursif

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.

Page 12: Rekursif

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.

Page 13: Rekursif
Page 14: Rekursif

* 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);

}

Page 15: Rekursif

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

Page 16: Rekursif

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.

Page 17: Rekursif

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

Page 18: 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)

Page 19: Rekursif

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

Page 20: Rekursif

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

Page 21: Rekursif

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

Page 22: Rekursif

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

Page 23: Rekursif

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

Page 24: Rekursif

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

Page 25: Rekursif

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.

Page 26: Rekursif

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)

Page 27: Rekursif

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

Page 28: Rekursif

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

Page 29: Rekursif

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

Page 30: Rekursif

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));

}