You are on page 1of 4

Analisis Algoritma Nonrekursif pada Angka Fibonacci

Purnama Adhi Putra, Shandi Dani K, Muhammad Aditya F., Muhammad Chafidh M. Jurusan Teknik Informatika, Sekolah Tinggi Teknik Telkom Jln. Telekomunikasi, Bandung andhi_rhein@yahoo.com, janganpare@gmail.com, adhiet218@yahoo.com, achmad_37@yahoo.com

Abstrak Kami mengamati bahwa ketidakefisiennya komputasi dari fungsi rekursif yang bercabang tidak terdapat di hampir semua buku pelajaran teknik informatika untuk kurikulum tahun-tahun awal.Deret fibonacci sering dipakai sebagai contoh fungsi rekursif yang bercabang.Bagaimanapun juga kompleksitas waktu yang eksponensial pada angka fibonacci jarang dijelaskan dan dibuktikan secar teori pada buku-buku kuliah.Sedangkan alternative solusi lain dengan cara linear juga jarang sekali diterangkan.Kami memberikan contoh yang sangat sederhana bahwa fungsi rekursif yang bercabang mempunyai kompleksitas waktu yang eksponensial.Pembuktian ini perlu untuk melengkapi penjelasan pada materi kuliah. Kata kunci :fibonacci, rekursif ,kompleksitas ,solusi waktu linear

Abstract We observe that the computational inefficiency of branched recursive functions was not appropriately covered in almost all textbooks or computer science courses in the first years of the curriculum for informatics engineering. Fibonacci numbers frequently used as examples of branched recursive functions. However, their exponential time complexity was rarely explained and never completely proved in the textbooks. Alternative linear time solutions were rarely mentioned. We give very simple proofs that these recursive functions have exponential time complexity. The proofs are appropriate for coverage in the first computer science course. Key Words: Fibonacci, recursive, complexity, linear time solution

Pendahuluan Rekursif adalah salah satu cara penyelesaian masalah dan juga merupakan salah satu teknik pemrograman yang mana teknik ini harus dipahami oleh mahasiswa pada tingkat awal perkuliaahan teknik informatika baik dalam kuliah pemrograman computer atau algoritma dan struktur data. Algoritma rekursif adalah sebuah fungsi, prosedur, metode yang memanggil dirinya sendiri dan bentuk dimana pemangilan subrutin terdapat dalam body subrutin, seperti halnya struktur pengulangan seperti for..loop, while.do, repeatuntil dan lain-lain yang memiliki kondisi awal dan akhir pengeksekusian,algoritma rekursif juga memiliki kondisi yaitu base case dan end case, Base case menunjukan batas bawah berapa kali

algoritma rekursif akan memanggil dirinya sendiri.serta end case adalah kondisi berhentinya atau jumlah maksimal inputan yang akan diproses.Selain syarat kondisi basis diatas subrutin call yang melibatkan parameter yang nilainya menuju kondisi terminal (recurrence) harus terpenuhi. Kita dapat mengenali apakah sebuah fungsi itu rekursif atau tidak dengan melihat di source code, jika ini sebuah fungsi atau prosedur yang memanggil dirinya sendiri maka ini adalah rekursif. Bentuk rekursif juga bertujuan untuk menyederhanakan penulisan program dan menggantikan bentuk iterasi. Rekursif sangat berarti karena banyak algoritma perlu untuk diimplementasikan secara rekursif seperti kombinatorial dengan algoritma brute force, backtracking, fibonacci dan lain-lain. Selain itu dengan rekursif program akan lebih mudah untuk dilihat

Konsep Ada dua tipe rekursif : linear recurrision dan multiple branch (tree) recursion 1. Linear recursion

2. Sebuah node yang mereferensi ke sebuah tree yang dalam kasus ini disebut akar dari tree ditunjukkan oleh F6. 3. Node-node yang digabungkan dan mereferensi pada satu akar yang membentuk sebuah pohon. Karena algoritma rekursif untuk mengevaluasi funsi Fibonacci dapat ditampilkan sebagai sebuah tree, maka proses ini dinamakan tree yang rekursif. Analisis Algoritma Algoritma recursion rekursif pada Fibonacci branch

Adalah rekursif yang mana urutan pertumbuhannya adalah linear atau tidak bercabang. Contoh dari linear rucursif untuk kasus angka fibonacci Untuk n = 6 maka angka fibonacci yang diperoleh = 1, 1, 2, 3, 5, 8, 13

Fibonacci_1 (int N) If (N < 0) return ERROR {base condition} If (N =1) return 1 If (N =2) return 1 2. Tree recursion / branch recursion {base condition} {base condition}

Tree rekursif akan bercabang menjadi lebih dari satu node pada setiap langkahnya (seperti digambarkan dibawah) dan akan tumbuh sangat cepat.ini memberikan kepada kita kesulitan dalam pemecahan masalah. Rekursif jenis ini akan mempunyai pertumbuhan kuadratik, kubik atau bahkan lebih rekursif jenis ini tidak cocok untuk memecahkan masalah yang besar. Contoh : Penyelesain Tower of Hanoi, Searching (DFS, BFS), Fibonacci number.

Else Return Fibonacci(N-1)+Fibonacci(N-2) {recursion condition} Dengan algoritma di atas kita misalkan nilai awal dari angka Fibonacci dengan n = 6 maka deret yang dihasilkan adalah: 1, 1, 2, 3, 5, 8. Dari hasil analisis maka dapat disimpulkan bahwa terjadi pemanggilan yang berulang-ulang terjadi pada branch recursive Fibonacci dengan n = 5

Gambar 1 Struktur yang ditunjukkan seperti pada gambar 1di atas adalah penggambaran dari tree recursion/branch recursion yang didefinisikan oleh poin-poin di bawah ini: 1 Sebuah node yang dalam masalah ini disebut leaf node.

Gambar 2 Berikut ini merupakan contoh perhitungan iterasi Fib(5) berdasarkan tree recursion/branch recursion yang alurnya sesuai dengan gambar 2 : Pembuktian dengan masukkan nilai Fib (5) = fib (3) + fib (4) Fib (3) = fib (1) + fib (2) Fib (1) = 1

Fib (2) = fib (1) + fib (0) Fib (1) = 1 Fib (0) = 0 Fib (2) = 1 + 0 = 1 Fib (3) = 1 + 1 = 2 Fib (4) = fib (3) + fib (2) Fib (3) = fib (1) + fib (2) Fib (1) = 1 Fib (2) = fib (1) + fib (0) Fib (1) = 1 Fib (0) = 0 Fib (2) = 1 + 0 = 1 Fib (3) = 1 + 1 = 2 Fib (2) = fib (1) + fib (0) Fib (1) = 1 Fib (0) = 0 Fib (2) = 1 + 0 = 1 Fib (4) = 2 + 1 = 3 Fib (5) = 3 + 2 = 5 Pembuktian kompleksitas waktu algoritma angka Fibonacci pada branch recursion f ( n ) = f ( n - 1 )+ f ( n 2 ) = f (n2) + f (n 3) + f (n 2) = 2f (n-2) + f (n3) > 2 f (n -2z) Dari hasil diatas akan diperoleh f (n) > 2f(n2) > 2( f(n22 ) = 4f(n4) > 4(f (n42)) = 8 f (n 6) >..... .> 2 k f (n 2 k). untuk n-2k > 0 dan akan berhenti untuk n2k=2 dan n-2k=1 f(1)=f(2)=1 dengan K adalah ( n 1 ) / 2 diperoleh f(n). 2 ( n1) / 2 (eksponensial)

angka fibonacci dari 1 sampai N dan setiap langkah dan menyimpan hasil dari nilai dua angka fibonacci sebelumnya Solusi sederhana fibonacci nonrekursif Fibonacci_2 (int N) If (N < 1) return ERROR If (N=1) return 1 IF (n=2) return 1 FibMinus2 = 0 FibMinus1 = 1 For I = 1 to N do O (1) O (1) O (1) O (1) O (1) O (N)

FibMinus2 = FibMinus1 + FibMinus2 FibMinus1 = FibMinus2 - FibMinus1 Return FibMinus2 End Contoh : Fibonacci_2 (5) For i=1 to N Untuk i = 1 FibMinus2 = 1 + 0 = 1 FibMinus1 = 1 1 = 0 Untuk i = 2 FibMinus2 = 0 + 1 = 1 FibMinus1 = 1 0 = 1 Untuk i = 3 FibMinus2 = 1 + 1 = 2 FibMinus1 = 2 1 = 1 Untuk i = 4 FibMinus2 = 1 + 2 = 3 FibMinus1 = 3 1 = 2 Untuk i = 5 FibMinus2 = 2 + 3 = 5 FibMinus1 = 5 2 = 3 Untuk i = 6 FibMinus2 = 3 + 5 = 8 FibMinus1 = 8 3 = 5 Agoritma Fibonacci_2 jelas mempunyai O (N) dan lebih efisien daripada fibonacci_1 dengan nilai yang lebiha besar dari N Kesimpulan Rekursif adalah sebuah teknik pemecahan masalah yang efisien untuk dipakai dalam definisi dan

Dari hasil diatas akan diperoleh kompleksitas waktu yang eksponensial yang mana ini adalah jenis kompleksitas algoritma yang buruk. ini berarti bahwa setiap waktu yang terjadi kita menggandakan jumlah dari setiap langkah, sebagai contoh fib(N) adalalah jumlah dari fib(N-1) + fib(N-2). Dari gambar juga diperoleh bahwa partumbuhan angka fibonacci atau kompleksitasnya adalah O (2 n). Pembuktian dengan memasukkan nilai pada algoritma diatas juga memperlihatkan kita bahwa akan banyak terjadi duplikasi dalam penghitungan dan pemanggilan rekursif .Salah satu cara untuk menghilangkan duplikasi adalah menjumlahkan

algoritma, yang mana dalam pemakaiannya hanya melakukan sekali pemanggilan. Tetapi akan menjadi sangat tidak efisien jika memanggil dua atau lebih pemanggilan karena akan diperoleh kompleksitas waktu yang eksponensial.

Daftar Pustaka [1] T. H. Cormen, C. E. Leiserson, and R. L. Rivest, Introduction to Algorithms: McGraw Hill, 1990. [2] Levitin, Anany. 2003. Introductionto The Design and Analysis of Algorithms. United States of America. Addison-Wesley. [3] www.wikipedia.com [4] www.ics.edu.com [5] Munir, Rinaldi 2003 Matematika Diskrit.Informatika [6] www.gnu.org

You might also like