Anda di halaman 1dari 21

ALGORITMA DAN PEMROGRAMAN

Nucke Widowati KP, M.Sc

Recursion
Dalam java, sebuah method dapat memanggil dirinya sendiri Method yang demikian dikatakan bersifat recursive Secara umum recursion adalah proses mendefinisikan sesuatu dalam suatu method, memanggil method tsb, serupa dengan konsep circular definition
Nucke Widowati KP, M.Sc

Recursion
Merupakan mekanisme kontrol yang powerful Programmer harus fokus pada penghentian fungsi dengan cara pemeriksaan statement mana yang memerlukan fungsi pemanggilan dan statement yang tidak memerlukan fungsi pemanggilan (trivial cases)
Nucke Widowati KP, M.Sc

Recursion
Contoh klasik recursion: menghitung bilangan faktorial 3! = 1 x 2 x 3 n! = n (n 1) ... 1 = n (n 1)! 0! = 1 by definition (terminal state).
Nucke Widowati KP, M.Sc

class RecursiveFactorial { public static int Factorial (int n) { if (n==0) return 1 ; // Terminal stage else return n* Factorial(n-1) ; // Apply recurrence equation } public static void main ( String [ ] arg ) {System.out.println("10!="+Factorial(10));} }
Nucke Widowati KP, M.Sc

Visualisasi function call stack pada recursive

Nucke Widowati KP, M.Sc

// A simple example of recursion. class Factorial { // This is a recursive function. int factR(int n) { int result; if(n==1) return 1; result = factR(n-1) * n; return result; } // This is an iterative equivalent. int factI(int n) { int t, result; result = 1; for(t=1; t <= n; t++) result *= t; return result; }}

class Recursion { public static void main(String args[]) { Factorial f = new Factorial(); System.out.println("Factorials using recursive method."); System.out.println("Factorial of 3 is " + f.factR(3)); System.out.println("Factorial of 4 is " + f.factR(4)); System.out.println("Factorial of 5 is " + f.factR(5)); System.out.println(); System.out.println("Factorials using iterative method."); System.out.println("Factorial of 3 is " + f.factI(3)); System.out.println("Factorial of 4 is " + f.factI(4)); System.out.println("Factorial of 5 is " + f.factI(5)); }}

Eksekusi recursive call ke factR()


Nucke Widowati KP, M.Sc

Output:
Factorials using recursive method. Factorial of 3 is 6 Factorial of 4 is 24 Factorial of 5 is 120 Factorials using iterative method. Factorial of 3 is 6 Factorial of 4 is 24 Factorial of 5 is 120
Nucke Widowati KP, M.Sc

Recursive factR()
Ketika factR() dipanggil dengan argumen 1, method akan mengembalikan hasil 1 jika tidak, akan mengembalikan hasil factR(n1)*n. Untuk mengevaluasi ekspresi tersebut, factR() dipanggil dengan n-1 Proses tersebut diulangi hingga n=1 dan pemanggilan ke method mengembalikan hasil
Nucke Widowati KP, M.Sc

Ketika method memanggil dirinya sendiri, variabel lokal dan parameter baru dialokasikan, kode-kode di dalam method akan dieksekusi menggunakan variabel baru tersebut dari awal Pemanggilan recursive bukan merupakan salinan method, hanya argumennya yang baru
Nucke Widowati KP, M.Sc

Eksekusi rekursi mungkin akan lebih lama daripada iterasi biasa Terlalu banyak pemanggilan recursive dapat mengakibatkan stack overrun Penyimpanan parameter dan variabel lokal ada di dalam stack dan setiap pemanggilan akan membuat salinan baru dari varibel ini, stack menjadi penuh Java run-time system membuat exception
Nucke Widowati KP, M.Sc

Gunakan rekursif jika:


Penyelesaian sulit dilakukan secara iterative Efisiensi dengan cara rekursif sudah memadai Efisiensi bukan prioritas masalah dibandingkan dengan kejelasan logika program
Nucke Widowati KP, M.Sc

Tips:
Gunakan conditional statements, seperti if, untuk memaksa method mengembalikan nilai tanpa eksekusi recursive, jika tidak maka sekali method dipanggil, maka tidak akan berhenti (merupakan kesalahan umum dalam recursion) Gunakan println() statement untuk mengecek proses yang terjadi, dan bisa membatalkan eksekusi jika terjadi kesalahan
Nucke Widowati KP, M.Sc

Bilangan Fibonacci
Ditemukan oleh Leonard de Pise (11701245) a.k.a Fibonacci Didefinisikan dengan urutan {Fi}i dari bilangan natural Suku ke-n merupakan penjumlahan dari suku ke-(n-1) dan ke-(n-2)

Nucke Widowati KP, M.Sc

Bilangan Fibonacci
Deret Fibonacci: 1,1,2,3,5,8,13,21,34,55, Deret ini penting untuk mempelajari karakteristik populasi dalam model dasar Ada sepasang anak kelinci, asumsikan dalam satu bulan anak kelinci tadi akan menjadi dewasa, kemudian akan melahirkan anakanak kelinci yang lain Berapa anak kelinci yang ada setelah beberapa bulan?
Nucke Widowati KP, M.Sc

F1 = 1 ( terminal state) F2 = 1 ( terminal state) Jumlah kelinci Fi saat bulan ke- i adalah jumlah kelinci pada bulan i 1 ditambah jumlah kelinci dari kelinci yang sudah dewasa Jumlah kelinci dewasa pada bulan kei adalah Fi2. Hubungannya adalah : Fi = Fi1+Fi2 with F1 = Widowati KP, M.Sc F2 = 1 (terminal states). Nucke

class FibonacciSequence { public static int Fibonacci ( int n) { i f (n<=1) return 1 ; else return Fibonacci (n1)+Fibonacci (n2) ; } public static void main ( String [ ] args ) { int i ; for ( i=0; i <=30; i++) System . out . print ( Fibonacci ( i )+" ") ; } } Nucke Widowati KP, M.Sc

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121 393 196418 317811 514229 832040 1346269
Nucke Widowati KP, M.Sc

Logarithmic Mean
Untuk mengukur perbedaan suhu Ada beberapa definisi yang terdapat dalam literatur, salah satunya adalah:

L(x) = x menjadi terminal case


Nucke Widowati KP, M.Sc

Logarithmic mean
Untuk dua elemen x dan y, logarithmic mean adalah:

Nucke Widowati KP, M.Sc

static double LogarithmicMean (double [ ] array , int i , int j ){ // Terminal case: One element. The mean is always this element i f ( ji ==0) return array [ i ] ; else {int n=ji +1; return (n1) ( LogarithmicMean ( array , i+1, j )LogarithmicMean ( array , i , j 1) ) /(Math . log ( array [ j ] )Math . log ( array [ i ] ) ) ; }} s tatic double LogarithmicMean (double [ ] array ) {return LogarithmicMean ( array , 0 , array . length 1) ;}
Nucke Widowati KP, M.Sc