Tugas Anda adalah untuk menemukan n th nomor Fibonacci, tetapi n belum tentu integer.
Urutan Fibonacci, diindeks 0, berlaku sebagai berikut:
0, 1, 2, 3, 4, 5, 6, 7, ...
1, 1, 2, 3, 5, 8, 13, 21, ...
Namun, apa yang terjadi jika kita ingin 2 0,4 th nomor?
2,4 th angka adalah 0,4 kali perbedaan antara 3 rd dan 2 nd angka Fibonacci ditambah 2 nd nomor Fibonacci. Jadi, 2,4 th nomor Fibonacci adalah 2 + 0.4 * (3 – 2) = 2.4
.
Demikian pula, 6,35 th nomor Fibonacci adalah 13 + 0.35 * (21 – 13) = 15.8
.
Tugas Anda adalah untuk menemukan n th nomor Fibonacci, sehingga n lebih besar dari atau sama dengan 0.
Anda dapat melakukan ini nol atau satu diindeks, harap katakan saja mana yang Anda gunakan.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
Beberapa contoh lagi:
0 1
4.5 6.5
0.7 1
7 21
F_0 = 0
danF_2 = 1
, kita seharusnya memilikiF_1 = (1/2)(F_0 + F_2) = 1/2
.Jawaban:
Jeli , 5 byte
Ini adalah solusi berulang tanpa built-in. Ini menggunakan pengindeksan yang sama dengan spec tantangan.
Cobalah online!
Latar Belakang
Biarkan f menjadi fungsi yang didefinisikan dalam spec tantangan dan F fungsi Fibonacci didefinisikan seperti biasa (yaitu, dengan F (0) = 0 ). Untuk bilangan bulat n -negatif , kita memiliki f (n) = F (n + 1) . Ketika 0 ≤ x <1 , spec tantangan mendefinisikan f (n + x) sebagai f (n) + (f (n + 1) - f (n)) x .
Jelas, ini hanya mempengaruhi kasus dasar, tetapi tidak formula rekursif, yaitu, f (n) = f (n - 1) + f (n - 2) memegang karena akan untuk F . Ini berarti kita dapat menyederhanakan definisi untuk argumen non-integer menjadi lebih mudah f (n) = f (n) + f (n - 1) x .
Seperti yang telah dicatat orang lain dalam jawaban mereka, hubungan rekursif juga berlaku untuk argumen non-integer. Ini mudah diverifikasi, karena
Karena f (0) = f (1) = 1 , f dalam konstanta dalam interval [0, 1] dan f (0 + x) = 1 untuk semua x . Selanjutnya, f (-1) = F (0) = 0 , jadi f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Kasing dasar ini mencakup [-1, 1) , jadi bersama dengan rumus rekursif, mereka melengkapi definisi f .
Bagaimana itu bekerja
Seperti sebelumnya, misalkan n + x menjadi satu-satunya argumen dari program monadik kami.
¡
itu cepat , artinya ia mengkonsumsi beberapa tautan di sebelah kirinya dan mengubahnya menjadi tautan cepat .¡
khususnya mengkonsumsi satu atau dua tautan.<F:monad|dyad><N:any>
memanggil tautan N , mengembalikan r , dan mengeksekusi F total r kali.<nilad|missing><F:monad|dyad>
set r ke argumen baris perintah terakhir (atau input dari STDIN jika tidak ada) dan mengeksekusi F total r kali.Karena
1
adalah nilad (tautan tanpa argumen), kasus kedua berlaku, dan+¡
akan dieksekusi+
n kali (argumen non-integer dibulatkan ke bawah). Setelah setiap panggilan ke+
, argumen kiri quicklink diganti dengan nilai balik, dan argumen kanan dengan nilai sebelumnya dari argumen kiri.Sedangkan untuk seluruh program,
Ḟ
lantai input, menghasilkan n ; kemudian_
kurangi hasil dari input, menghasilkan ** x, yang menjadi nilai pengembalian.1+¡
kemudian memanggil+¡
- seperti yang dijelaskan sebelumnya - dengan argumen kiri 1 = f (0 + x) dan argumen kanan x = f (-1 + x) , yang menghitung output yang diinginkan.sumber
+¡
untuk tantangan Fibonacci. Apakah itu bertujuan untuk¡
bekerja seperti fibonacci dengan pasangan?%1+¡
: interpolasi linier antara n × F (n) pada n dan n × F (n-1) + F (n) pada n-ε , dan naik di antara n-ε dan n .%1+¡
seharusnya dilakukan?Mathematica, 32 byte
Fungsi murni mengambil bilangan real non-negatif sebagai input dan mengembalikan bilangan real. Jika
1~Max~#
digantikan oleh1
, ini akan menjadi definisi rekursif standar dari angka Fibonacci yang diindeks untuk argumen integer. Tapi1~Max~#
apakah fungsi linear piecewise yang benar untuk input nyata antara 0 dan 2, dan rekursi menangani sisanya. (Fakta Trivia: mengubah ini ke angka Fibonacci 1-indeks dapat dicapai hanya dengan mengubahMax
ke aMin
!)Terpendek yang bisa saya dapatkan dengan builtin adalah 37-byte
(b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&
.sumber
Python 2 , 42 byte
Cobalah online!
sumber
JavaScript (ES6), 30 byte
Modifikasi sepele dari definisi urutan Fibonacci rekursif diindeks-nol. Dapat memberikan sedikit kesalahan pembulatan untuk beberapa input.
sumber
Jelly ,
1712 byteCobalah online!
Solusi non-builtin.
Penjelasan
Fungsi pembantu
1Ŀ
Program utama
Input dalam rentang 0 hingga 1 akan jenuh-kurangi menjadi 0, jadi kami menambahkan 1 untuk mendapatkan F (0) = F (1) = 1. Input dalam rentang 1 hingga 2 akan kembali dengan sendirinya. Kasing dasar tersebut cukup untuk melakukan rekursi Fibonacci dan menghitung nilai-nilai lain dari sana.
sumber
Excel,
137 124 119 113 10297 BytesPendekatan non-rekursif / berulang. (Langsung menghitung istilah ke-n). Ini menggunakan metode satu-indeks . Menambahkan
+1
untuk=TRUNC(B1)
mengubahnya ke indeks-nol.Cuplikan kode dimaksudkan untuk ditempatkan mulai di sel A1 .
Sel input adalah B1 . Sel output adalah A1 .
sumber
JavaScript (ES6),
6764 byteMemiliki beberapa masalah dengan pembulatan
Cobalah
sumber
PHP, 90 Bytes
Versi Online
sumber
Jelly ,
139 byteIni menggunakan pengindeksan yang sama dengan spec tantangan.
Cobalah online!
Latar Belakang
Per spec, kita memiliki F (n + x) = F (n) + (F (n + 1) - F (n)) x , untuk alam n dan 0 ≤ x <1 . Sejak F (n + 1) = F (n) + F (n - 1) , ini dapat ditulis kembali sebagai F (n + x) = F (n) + F (n - 1) x .
Selanjutnya, pengindeksan yang digunakan dalam spec tantangan mendefinisikan fungsi f (n) = F (n + 1) (di mana F adalah fungsi Fibonacci yang biasa, yaitu, F (0) = 0 ), jadi kami mendapatkan formula f (n) + x) = F (n + 1) + F (n) x .
Bagaimana itu bekerja
sumber
Perl 6 ,
4838 byte48
Cobalah
38
Cobalah
Diperluas:
48
(
$0
dan$1
merupakan kependekan dari$/[0]
dan$/[1]
)38
Ini terinspirasi oleh solusi Python , dan Javascript lainnya
sumber
Julia 0,5 , 31 byte
Ini pada dasarnya hanya jawaban Rod yang diterjemahkan.
Cobalah online!
sumber