Deret Fibonacci adalah sebuah deret angka yang dimulai dengan dua angka pertama, yaitu 0 dan 1, dan setiap angka berikutnya merupakan jumlah dari dua angka sebelumnya. Secara matematis, deret Fibonacci didefinisikan sebagai:
F(0)=0F(0) = 0 F(1)=1F(1) = 1 F(n)=F(n−1)+F(n−2) untuk n>1F(n) = F(n-1) + F(n-2) untuk n > 1
Contoh deret Fibonacci pertama adalah: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Di Java, kita bisa membuat program untuk menghitung dan menampilkan deret Fibonacci dengan berbagai pendekatan: menggunakan rekursi, iterasi, atau bahkan menggunakan pendekatan matematika langsung.
1. Implementasi Deret Fibonacci dengan Iterasi
Pendekatan iteratif menggunakan perulangan untuk menghitung angka Fibonacci. Ini adalah cara yang efisien karena hanya membutuhkan memori untuk menyimpan dua angka sebelumnya.
public class FibonacciIterative { public static void main(String[] args) { int n = 10; // Jumlah elemen yang ingin ditampilkan System.out.println("Deret Fibonacci (Iteratif) hingga " + n + " elemen:"); int a = 0, b = 1; // Menampilkan dua angka pertama System.out.print(a + " " + b + " "); // Menghitung dan menampilkan angka Fibonacci selanjutnya for (int i = 2; i < n; i++) { int next = a + b; System.out.print(next + " "); a = b; b = next; } } }
Penjelasan:
- Kita memulai dengan dua angka pertama, yaitu
a = 0
danb = 1
. - Menggunakan loop untuk menghitung angka Fibonacci selanjutnya dan memperbarui nilai
a
danb
pada setiap iterasi.
Output:
Deret Fibonacci (Iteratif) hingga 10 elemen: 0 1 1 2 3 5 8 13 21 34
2. Implementasi Deret Fibonacci dengan Rekursi
Pendekatan rekursif melibatkan fungsi yang memanggil dirinya sendiri untuk menghitung angka Fibonacci. Meskipun pendekatan ini lebih sederhana, namun tidak efisien untuk angka yang besar karena memiliki kompleksitas waktu eksponensial.
public class FibonacciRecursive { public static void main(String[] args) { int n = 10; // Jumlah elemen yang ingin ditampilkan System.out.println("Deret Fibonacci (Rekursif) hingga " + n + " elemen:"); for (int i = 0; i < n; i++) { System.out.print(fibonacci(i) + " "); } } // Fungsi rekursif untuk menghitung angka Fibonacci public static int fibonacci(int n) { if (n == 0) return 0; // Basis: F(0) if (n == 1) return 1; // Basis: F(1) return fibonacci(n - 1) + fibonacci(n - 2); // Rekursi: F(n) = F(n-1) + F(n-2) } }
Penjelasan:
- Fungsi
fibonacci(n)
menghitung angka Fibonacci untuk nilain
dengan cara memanggil dirinya sendiri untuk menghitung angka sebelumnya. - Kondisi dasar (
base case
) adalah ketikan = 0
ataun = 1
.
Output:
Deret Fibonacci (Rekursif) hingga 10 elemen: 0 1 1 2 3 5 8 13 21 34
Catatan: Pendekatan rekursif ini kurang efisien untuk angka besar karena menghitung ulang angka Fibonacci yang sama berkali-kali.
3. Implementasi Deret Fibonacci dengan Memori Dinamis (Dynamic Programming)
Untuk menghindari perhitungan yang berulang pada pendekatan rekursif, kita bisa menggunakan teknik memori dinamis (dynamic programming). Teknik ini menyimpan hasil perhitungan Fibonacci yang sudah dilakukan dalam array atau struktur data lainnya.
public class FibonacciDynamic { public static void main(String[] args) { int n = 10; // Jumlah elemen yang ingin ditampilkan System.out.println("Deret Fibonacci (Memori Dinamis) hingga " + n + " elemen:"); // Array untuk menyimpan hasil Fibonacci int[] fib = new int[n]; // Menetapkan dua nilai pertama fib[0] = 0; fib[1] = 1; // Menghitung angka Fibonacci dengan memori dinamis for (int i = 2; i < n; i++) { fib[i] = fib[i - 1] + fib[i - 2]; } // Menampilkan hasil Fibonacci for (int i = 0; i < n; i++) { System.out.print(fib[i] + " "); } } }
Penjelasan:
- Kita menggunakan array
fib[]
untuk menyimpan hasil perhitungan Fibonacci. - Setiap angka Fibonacci dihitung berdasarkan dua angka sebelumnya yang sudah disimpan di dalam array.
Output:
Deret Fibonacci (Memori Dinamis) hingga 10 elemen: 0 1 1 2 3 5 8 13 21 34
Keunggulan: Pendekatan ini jauh lebih efisien dibandingkan dengan rekursi murni karena tidak menghitung angka yang sama berulang kali.
4. Implementasi Deret Fibonacci dengan Optimasi Ruang (Space Optimization)
Jika kita ingin mengurangi penggunaan memori lebih lanjut, kita bisa mengoptimalkan ruang dengan hanya menyimpan dua angka Fibonacci terakhir yang dihitung, karena setiap angka hanya bergantung pada dua angka sebelumnya.
public class FibonacciOptimizedSpace { public static void main(String[] args) { int n = 10; // Jumlah elemen yang ingin ditampilkan System.out.println("Deret Fibonacci (Optimasi Ruang) hingga " + n + " elemen:"); int a = 0, b = 1; // Menampilkan dua angka pertama System.out.print(a + " " + b + " "); // Menghitung dan menampilkan angka Fibonacci selanjutnya for (int i = 2; i < n; i++) { int next = a + b; System.out.print(next + " "); a = b; b = next; } } }
Penjelasan:
- Alih-alih menggunakan array untuk menyimpan semua angka, kita hanya menyimpan dua angka terakhir (
a
danb
), yang sangat mengurangi penggunaan memori.
Output:
Deret Fibonacci (Optimasi Ruang) hingga 10 elemen: 0 1 1 2 3 5 8 13 21 34
Kesimpulan
Deret Fibonacci di Java bisa dihitung menggunakan beberapa pendekatan, masing-masing dengan kelebihan dan kekurangan:
- Iterasi: Efisien dalam hal waktu dan ruang, cocok untuk menghitung deret Fibonacci dalam jumlah besar.
- Rekursi: Menyederhanakan kode, tetapi tidak efisien untuk angka besar karena perhitungan yang berulang.
- Memori Dinamis (Dynamic Programming): Efisien dalam hal waktu, menghindari perhitungan berulang, tetapi menggunakan lebih banyak memori dibandingkan iterasi.
- Optimasi Ruang: Mengurangi penggunaan memori dengan hanya menyimpan dua angka terakhir, sangat efisien dalam hal ruang.
Pilihlah pendekatan yang paling sesuai dengan kebutuhan aplikasi Anda!
source: chatgpt