Siri Fibonacci di Jawa

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat siri Fibonacci.

Secara khusus, kami akan melaksanakan tiga cara untuk mengira istilah ke -9 siri Fibonacci, yang terakhir adalah penyelesaian masa tetap.

2. Siri Fibonacci

Siri Fibonacci adalah rangkaian nombor di mana setiap istilah adalah jumlah dari dua istilah sebelumnya . Dua istilah pertama adalah 0 dan 1 .

Sebagai contoh, 11 istilah pertama siri ini adalah 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, dan 55 .

Dalam istilah matematik, urutan S n dari nombor Fibonacci ditakrifkan oleh hubungan berulang:

S(n) = S(n-1) + S(n-2), with S(0) = 0 and S(1) = 1

Sekarang, mari kita lihat bagaimana mengira istilah ke -9 siri Fibonacci. Tiga kaedah yang akan kami fokuskan adalah rekursif, berulang, dan menggunakan formula Binet.

2.1. Kaedah Rekursif

Untuk penyelesaian pertama kami, mari kita menyatakan hubungan berulang secara langsung di Java:

public static int nthFibonacciTerm(int n) { if (n == 1 || n == 0) { return n; } return nthFibonacciTerm(n-1) + nthFibonacciTerm(n-2); }

Seperti yang dapat kita lihat, kita memeriksa sama ada n sama dengan 0 atau 1. Sekiranya benar, maka kita mengembalikan nilai itu. Dalam kes lain, kami secara berulang memanggil fungsi untuk mengira istilah (n-1) dan (n-2) istilah dan mengembalikan jumlahnya.

Walaupun kaedah rekursif mudah dilaksanakan, kita melihat bahawa kaedah ini banyak melakukan pengiraan berulang. Sebagai contoh, untuk mengira istilah ke - 6 , kami membuat panggilan untuk mengira istilah ke- 5 dan ke- 4 . Lebih-lebih lagi, panggilan untuk mengira penggal ke - 5 membuat panggilan untuk mengira istilah ke - 4 sekali lagi. Kerana hakikat ini, kaedah rekursif melakukan banyak kerja berlebihan.

Ternyata, ini menjadikan kerumitan waktunya eksponensial; O (Φn) tepat.

2.2. Kaedah berulang

Dalam kaedah berulang, kita dapat mengelakkan pengiraan berulang yang dilakukan dalam kaedah rekursif. Sebaliknya, kami mengira istilah siri dan menyimpan dua istilah sebelumnya untuk mengira yang berikutnya.

Mari lihat pelaksanaannya:

public static int nthFibonacciTerm(int n) { if(n == 0 || n == 1) { return n; } int n0 = 0, n1 = 1; int tempNthTerm; for (int i = 2; i <= n; i++) { tempNthTerm = n0 + n1; n0 = n1; n1 = tempNthTerm; } return n1; }

Pertama, kita memeriksa sama ada istilah yang akan dikira adalah penggal ke- 0 atau penggal ke- 1 . Sekiranya demikian, kami mengembalikan nilai awal. Jika tidak, kami mengira penggal ke - 2 menggunakan n0 dan n1 . Kemudian, kami mengubah nilai pemboleh ubah n0 dan n1 masing-masing untuk menyimpan penggal 1 dan penggal ke - 2 . Kami terus berulang sehingga kami mengira jangka masa yang diperlukan.

Kaedah berulang mengelakkan kerja berulang dengan menyimpan dua istilah Fibonacci terakhir dalam pemboleh ubah. Kerumitan masa dan kerumitan ruang kaedah berulang adalah O (n) dan O (1) masing-masing.

2.3. Formula Binet

Kami hanya mendefinisikan nombor Fibonacci ke-2 dari segi dua sebelum itu. Sekarang, kita akan melihat formula Binet untuk mengira nombor Fibonacci ke-9 dalam masa yang tetap.

Istilah Fibonacci mengekalkan nisbah yang disebut nisbah emas yang dilambangkan oleh Φ , watak Yunani diucapkan 'phi' .

Pertama, mari kita lihat bagaimana nisbah emas dikira:

Φ = ( 1 + √5 )/2 = 1.6180339887...

Sekarang, mari lihat formula Binet :

Sn = Φⁿ–(– Φ⁻ⁿ)/√5

Sebenarnya, ini bermaksud bahawa kita seharusnya dapat memperoleh nombor Fibonacci ke - n hanya dengan beberapa aritmetik.

Mari kita nyatakan ini di Jawa:

public static int nthFibonacciTerm(int n) { double squareRootOf5 = Math.sqrt(5); double phi = (1 + squareRootOf5)/2; int nthTerm = (int) ((Math.pow(phi, n) - Math.pow(-phi, -n))/squareRootOf5); return nthTerm; }

Kami mengira squareRootof5 dan phi terlebih dahulu dan menyimpannya dalam pemboleh ubah. Kemudian, kami menggunakan formula Binet untuk mendapatkan jangka masa yang diperlukan.

Oleh kerana kita berurusan dengan nombor tidak rasional di sini, kita hanya akan mendapat perkiraan. Oleh yang demikian, kita perlu memegang lebih banyak tempat perpuluhan untuk nombor Fibonacci yang lebih tinggi untuk menjelaskan kesilapan bulat.

Kami melihat bahawa kaedah di atas mengira istilah Fibonacci ke-9 dalam masa yang tetap, atau O (1).

3. Kesimpulannya

Dalam artikel ringkas ini, kami melihat siri Fibonacci. Kami melihat penyelesaian berulang dan berulang. Kemudian, kami menggunakan formula Binet untuk membuat penyelesaian masa tetap.

Seperti biasa, kod sumber penuh contoh kerja boleh didapati di GitHub.