Nội suy tuyến tính của chuỗi Fibonacci


20

Nhiệm vụ của bạn là tìm số Fibonacci thứ n , nhưng n không nhất thiết phải là số nguyên.

Chuỗi Fibonacci, được lập chỉ mục 0, như sau:

0, 1, 2, 3, 4, 5,  6,  7, ...

1, 1, 2, 3, 5, 8, 13, 21, ...

Tuy nhiên, những gì sẽ xảy ra nếu chúng ta muốn 2 .4 thứ số?

Số thứ 2,4 gấp 0,4 lần so với số Fibonacci thứ 3 và thứ 2 cộng với số Fibonacci thứ 2 . Vì vậy, số Fibonacci thứ 2,4 là 2 + 0.4 * (3 – 2) = 2.4.

Tương tự, số Fibonacci thứ 6,35 là 13 + 0.35 * (21 – 13) = 15.8.

Nhiệm vụ của bạn là tìm số Fibonacci thứ n , sao cho n lớn hơn hoặc bằng 0.

Bạn có thể thực hiện việc này bằng 0 hoặc một chỉ mục, chỉ cần vui lòng cho biết bạn đang sử dụng cái nào.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Một số ví dụ khác:

0        1
4.5    6.5
0.7      1
7       21

2
Hoạt động bạn đang thực hiện ở đây được gọi là "nội suy tuyến tính". (Bạn có phiền nếu tôi thay đổi tiêu đề của bài đăng để phản ánh điều đó không?) Dường như nó có thuộc tính Fibonacci mà f (n-2) + f (n-1) = f (n), vì vậy tôi đoán đây là một sự khái quát hợp lý của chuỗi Fibonacci. (Tôi không chắc có bất kỳ khái quát hóa tiêu chuẩn nào không.)

@ ais523, nếu bạn nghĩ rằng nó sẽ cải thiện câu hỏi thì có, bạn có thể thay đổi tiêu đề của bài viết.
Daniel

Tôi nghĩ rằng nó sẽ làm cho câu hỏi dễ tìm thấy hơn trong tương lai nếu ai đó hỏi điều gì đó tương tự, và cũng làm cho nó rõ ràng hơn về những gì trong đó, nói, danh sách "Liên quan". Vì vậy, nó sẽ làm cho câu hỏi tốt hơn bằng cách giúp người trả lời đến đúng nơi.

2
@ais Hình như có sự khái quát hóa công thức Binet: mathworld.wolfram.com/FibonacciNumber.html
Neil

1
Mặc dù mã golf không phải chứng minh yêu cầu (tôi đoán vậy), đây có vẻ như là một hoạt động kỳ lạ; Theo nó, kể từ F_0 = 0F_2 = 1, chúng ta nên có F_1 = (1/2)(F_0 + F_2) = 1/2.
LSpice

Câu trả lời:


7

Thạch , 5 byte

_Ḟ1+¡

Đây là một giải pháp lặp mà không có sẵn. Nó sử dụng lập chỉ mục giống như thông số kỹ thuật thách thức.

Hãy thử trực tuyến!

Lý lịch

Đặt f là hàm được xác định trong thông số thách thức và F là hàm Fibonacci được xác định như bình thường (nghĩa là với F (0) = 0 ). Đối với số nguyên n không âm , ta có f (n) = F (n + 1) . Khi 0 ≤ x <1 , thông số thử thách xác định f (n + x)f (n) + (f (n + 1) - f (n)) x .

Rõ ràng, điều này chỉ ảnh hưởng đến các trường hợp cơ sở, nhưng không phải là công thức đệ quy, tức là f (n) = f (n - 1) + f (n - 2) tổ chức vì nó sẽ cho F . Điều này có nghĩa là chúng ta có thể đơn giản hóa định nghĩa cho các đối số không nguyên để dễ dàng hơn f (n) = f (n) + f (n - 1) x .

Như những người khác đã lưu ý trong câu trả lời của họ, mối quan hệ đệ quy cũng giữ cho các đối số không nguyên. Điều này dễ dàng kiểm chứng, như

bằng chứng

f (0) = f (1) = 1 , f không đổi trong khoảng [0, 1]f (0 + x) = 1 với mọi x . Hơn nữa, f (-1) = F (0) = 0 , vì vậy f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Các trường hợp cơ sở này bao gồm trong [-1, 1) , do đó, cùng với công thức đệ quy, chúng hoàn thành định nghĩa của f .

Làm thế nào nó hoạt động

Như trước đây, hãy để n + x là đối số duy nhất của chương trình đơn âm của chúng tôi.

¡là một cách nhanh chóng , có nghĩa là nó tiêu thụ một số liên kết bên trái và lần lượt của chúng thành một Quicklink . ¡đặc biệt tiêu thụ một hoặc hai liên kết.

  • <F:monad|dyad><N:any>gọi liên kết N , trả về r và thực hiện F tổng cộng r lần.

  • <nilad|missing><F:monad|dyad>đặt r thành đối số dòng lệnh cuối cùng (hoặc đầu vào từ STDIN khi vắng mặt) và thực thi F tổng cộng r lần.

1là một nilad (một liên kết không có đối số), trường hợp thứ hai được áp dụng và sẽ thực thi + n lần (một đối số không nguyên được làm tròn xuống). Sau mỗi cuộc gọi đến +, đối số bên trái của quicklink được thay thế bằng giá trị trả về và đối số bên phải bằng giá trị trước đó của đối số bên trái.

Đối với toàn bộ chương trình, tầng đầu vào, mang lại n ; sau đó _trừ kết quả từ đầu vào, thu được ** x, trở thành giá trị trả về.

1+¡sau đó gọi - như được mô tả trước - với đối số bên trái 1 = f (0 + x) và đối số bên phải x = f (-1 + x) , tính toán đầu ra mong muốn.


Ahh, làm thế nào hữu ích cho các thách thức Fibonacci. Đó có phải là mục đích để ¡làm việc như MySpace với dyads?
Erik the Outgolfer

Oooh - %1+¡: phép nội suy tuyến tính giữa n × F (n) tại nn × F (n - 1) + F (n) tại n - và bước lên giữa n - εn .
Jonathan Allan

@EriktheOutgolfer Vâng, ít nhiều. Vì Jelly không có biến, nên bạn sẽ mất quyền truy cập vào các thành viên chuỗi trước đó, do đó, thật hợp lý khi thực hiện nó như thế này.
Dennis

@Jonathan ALLan Tôi không chắc là tôi hiểu. Phải %1+¡làm gì đây?
Dennis

@Dennis erm, có nghĩa là , tốt \ _o_ / ... nhưng đó là những gì nó dường như làm với thử nghiệm: D
Jonathan Allan

5

Toán học, 32 byte

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

Hàm thuần túy lấy một số thực không âm làm đầu vào và trả về một số thực. Nếu 1~Max~#được thay thế bằng 1, đây sẽ là định nghĩa đệ quy tiêu chuẩn của các số Fibonacci được lập chỉ mục 0 cho các đối số nguyên. Nhưng 1~Max~#là hàm tuyến tính chính xác cho các đầu vào thực trong khoảng từ 0 đến 2, và đệ quy sẽ đảm nhiệm phần còn lại. (Sự thật phũ phàng: việc thay đổi số này thành các số Fibonacci 1 chỉ số có thể được thực hiện chỉ bằng cách thay đổi Maxthành a Min!)

Thời gian ngắn nhất tôi có thể nhận được với nội dung là 37 byte (b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&.



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>

Sửa đổi tầm thường của định nghĩa trình tự đệ quy Fibonacci không có chỉ số. Có thể đưa ra các lỗi làm tròn nhẹ cho một số đầu vào.


Đây là thông minh. Tôi nghĩ rằng nó đã không làm việc.
Leaky Nun

1

Thạch , 17 12 byte

’Ñ+Ñ
’»0‘ÇỊ?

Hãy thử trực tuyến!

Giải pháp không tích hợp.

Giải trình

Chức năng trợ giúp 1Ŀ

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

Chương trình chính

’»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

Do đó, một đầu vào trong phạm vi 0 đến 1 sẽ bão hòa-trừ đi 0, do đó chúng ta thêm 1 để nhận F (0) = F (1) = 1. Một đầu vào trong phạm vi 1 đến 2 sẽ tự trả về. Những trường hợp cơ sở này là đủ để thực hiện đệ quy Fibonacci điển hình và tính toán các giá trị khác từ đó.


1

Excel, 137 124 119 113 102 97 byte

Cách tiếp cận không đệ quy / lặp. (Tính trực tiếp các điều khoản thứ n) Điều này sử dụng phương pháp một chỉ mục . Thêm vào +1để =TRUNC(B1)thay đổi nó thành không có chỉ mục.

=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

Đoạn mã dự định sẽ được đặt bắt đầu trong ô A1 .

Ô đầu vào là B1 . Ô đầu ra là A1 .


1

JavaScript (ES6), 67 64 byte

Có một vài vấn đề với làm tròn

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

Thử nó

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))



0

Thạch , 13 9 byte

,‘ḞÆḞḅ%1$

Điều này sử dụng lập chỉ mục tương tự như thông số kỹ thuật thách thức.

Hãy thử trực tuyến!

Lý lịch

Theo thông số kỹ thuật, chúng ta có F (n + x) = F (n) + (F (n + 1) - F (n)) x , cho n tự nhiên và 0 x <1 . Vì F (n + 1) = F (n) + F (n - 1) , nên điều này có thể được viết lại thành F (n + x) = F (n) + F (n - 1) x .

Hơn nữa, việc lập chỉ mục được sử dụng trong thông số thử thách xác định hàm f (n) = F (n + 1) (trong đó F là hàm Fibonacci thông thường, nghĩa là F (0) = 0 ), vì vậy chúng ta có được công thức f (n + x) = F (n + 1) + F (n) x .

Làm thế nào nó hoạt động

,‘ḞÆḞḅ%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).

0

Perl 6 ,  48  38 byte

48

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

Thử nó

38

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

Thử nó

Mở rộng:

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
}

( $0$1viết tắt của $/[0]$/[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
}

Điều này được lấy cảm hứng từ các giải pháp PythonJavascript khác


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.