Interpolasi linear dari deret Fibonacci

20

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 , jadi kode terpendek dalam byte menang!

Beberapa contoh lagi:

0        1
4.5    6.5
0.7      1
7       21
Daniel
sumber
2
Operasi yang Anda lakukan di sini disebut "interpolasi linier". (Apakah Anda keberatan jika saya mengubah judul posting untuk mencerminkan hal itu?) Tampaknya memiliki properti Fibonacci yang f (n-2) + f (n-1) = f (n), jadi saya rasa ini adalah generalisasi yang wajar dari deret Fibonacci. (Saya tidak yakin apakah ada generalisasi standar.)
@ ais523, jika Anda pikir itu akan meningkatkan pertanyaan, maka ya, Anda dapat mengubah judul posting.
Daniel
Saya pikir itu akan membuat pertanyaan lebih mudah ditemukan di masa depan jika seseorang menanyakan sesuatu yang serupa, dan juga membuatnya lebih jelas tentang apa yang ada dalam, katakanlah, daftar "Terkait". Jadi itu akan membuat pertanyaan lebih baik dengan membantu membawa para penjawab ke tempat yang tepat.
2
@ais Sepertinya ada generalisasi dari formula Binet: mathworld.wolfram.com/FibonacciNumber.html
Neil
1
Meskipun golf kode tidak harus membenarkan permintaan (saya kira), ini tampak seperti operasi yang aneh; sesuai dengan itu, sejak F_0 = 0dan F_2 = 1, kita seharusnya memiliki F_1 = (1/2)(F_0 + F_2) = 1/2.
LSpice

Jawaban:

7

Jeli , 5 byte

_Ḟ1+¡

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

bukti

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 1adalah 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.

Dennis
sumber
Ahh, seberapa berguna untuk tantangan Fibonacci. Apakah itu bertujuan untuk ¡bekerja seperti fibonacci dengan pasangan?
Erik the Outgolfer
Oooh - %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 .
Jonathan Allan
@EriktheOutgolfer Ya, kurang lebih. Karena Jelly tidak memiliki variabel, Anda akan kehilangan akses ke anggota urutan sebelumnya, jadi masuk akal untuk mengimplementasikannya seperti ini.
Dennis
@ Jonathan Allan Saya tidak yakin saya mengerti. Apa yang %1+¡seharusnya dilakukan?
Dennis
@ Dennis erm, maksudnya , well \ _o_ / ... tapi itulah yang tampaknya dilakukan dengan eksperimen: D
Jonathan Allan
5

Mathematica, 32 byte

If[#<2,1~Max~#,#0[#-1]+#0[#-2]]&

Fungsi murni mengambil bilangan real non-negatif sebagai input dan mengembalikan bilangan real. Jika 1~Max~#digantikan oleh 1, 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 mengubah Maxke a Min!)

Terpendek yang bisa saya dapatkan dengan builtin adalah 37-byte (b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&.

Greg Martin
sumber
3

JavaScript (ES6), 30 byte

f=x=>x<1?1:x<2?x:f(x-1)+f(x-2)
<input type=number value=2.4 oninput="O.value=f(value)"> <input id=O value=2.4 disabled>

Modifikasi sepele dari definisi urutan Fibonacci rekursif diindeks-nol. Dapat memberikan sedikit kesalahan pembulatan untuk beberapa input.

Produksi ETH
sumber
Ini pintar. Saya pikir itu tidak berhasil.
Leaky Nun
1

Jelly , 17 12 byte

’Ñ+Ñ
’»0‘ÇỊ?

Cobalah online!

Solusi non-builtin.

Penjelasan

Fungsi pembantu 1Ŀ

’Ñ+Ñ
 Ñ    Call the main program on
’       {the input} - 1;
   Ñ  Call the main program on {the input};
  +   Add those results{and return the result}

Program utama

’»0‘ÇỊ?
’        Subtract 1
 »0      but replace negative results with 0
     Ị?  If the result is less than or equal to 1
   ‘     Return the result plus 1
    Ç    else return the result

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
1

Excel, 137 124 119 113 102 97 Bytes

Pendekatan non-rekursif / berulang. (Langsung menghitung istilah ke-n). Ini menggunakan metode satu-indeks . Menambahkan +1untuk =TRUNC(B1)mengubahnya ke indeks-nol.

=A7+(A8-A7)*MOD(B1,1)
=5^.5
=(1+A2)/2
=TRUNC(B1)
=A4+1
=-1/A3
=(A3^A4-A6^A4)/A2
=(A3^A5-A6^A5)/A2

Cuplikan kode dimaksudkan untuk ditempatkan mulai di sel A1 .

Sel input adalah B1 . Sel output adalah A1 .

qoou
sumber
1

JavaScript (ES6), 67 64 byte

Memiliki beberapa masalah dengan pembulatan

n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)

Cobalah

f=
n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)
console.log(f(2.4))
console.log(f(6.35))
console.log(f(42.42))

Shaggy
sumber
0

PHP, 90 Bytes

for($f=[1,1];$i<$a=$argn;)$f[]=$f[+$i]+$f[++$i];echo$f[$b=$a^0]+($a-$b)*($f[$b+1]-$f[$b]);

Versi Online

Jörg Hülsermann
sumber
0

Jelly , 13 9 byte

,‘ḞÆḞḅ%1$

Ini 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

,‘ḞÆḞḅ%1$  Main link. Argument: n + x

 ‘         Increment; yield n + 1 + x.
,          Pair; yield [n + x, n + 1 + x].
  Ḟ        Floor; yield [n, n + 1].
   ÆḞ      Fibonacci; yield [F(n), F(n + 1)].
      %1$  Modulus 1; yield (n + x) % 1 = x.
     ḅ     Unbase; yield F(n)x + F(n + 1).
Dennis
sumber
0

Perl 6 ,  48  38 byte

48

{$/=(1,1,*+*...*)[$_,$_+1];$0+($_-.Int)*($1-$0)}

Cobalah

38

sub f(\n){3>n??max 1,n!!f(n-1)+f(n-2)}

Cobalah

Diperluas:

48

{
  $/ =          # store here so we can use $0 and $1
  (
    1,1,*+*...* # Fibonacci sequence
  )[
    $_,         # get the value by using floor of the input
    $_ + 1      # and get the next value
  ];

    $0            # the first value from above
  +
    ( $_ - .Int ) # the fractional part of the input
  *
    ( $1 - $0 )   # the difference between the two values in the sequence
}

( $0dan $1merupakan kependekan dari $/[0]dan$/[1] )

38

sub f (\n) {
    3 > n           # if n is below 3
  ??
    max 1, n        # return it if it is above 1, or return 1
                    # if it was below 1, the answer would be 1
                    # the result for numbers between 1 and 3
                    # would be the same as the input anyway
  !!
    f(n-1) + f(n-2) # the recursive way to get a fibonacci number
}

Ini terinspirasi oleh solusi Python , dan Javascript lainnya

Brad Gilbert b2gills
sumber