การแก้ไขเชิงเส้นของลำดับฟีโบนักชี


20

งานของคุณคือการหาn THตัวเลข Fibonacci แต่nไม่จำเป็นต้องเป็นจำนวนเต็ม

ลำดับ Fibonacci ดัชนี 0 ไปดังนี้:

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

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

แต่สิ่งที่เกิดขึ้นถ้าเราต้องการ 2 .4 THจำนวน?

2.4 THจำนวนคือ 0.4 ครั้งความแตกต่างระหว่าง 3 RDและ 2 ครั้งตัวเลข Fibonacci แถม 2 ครั้งจำนวนฟีโบนักชี ดังนั้น 2.4 THตัวเลข Fibonacci 2 + 0.4 * (3 – 2) = 2.4คือ

ในทำนองเดียวกัน 6.35 THตัวเลข Fibonacci 13 + 0.35 * (21 – 13) = 15.8คือ

งานของคุณคือการหาn THตัวเลข Fibonacci เช่นว่าnมีค่ามากกว่าหรือเท่ากับ 0

คุณอาจทำดัชนีนี้หรือศูนย์หนึ่งเพียงแค่บอกว่าคนที่คุณกำลังใช้

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

ตัวอย่างเพิ่มเติม:

0        1
4.5    6.5
0.7      1
7       21

2
การดำเนินการที่คุณทำที่นี่เรียกว่า "การแก้ไขเชิงเส้น" (คุณจะรังเกียจไหมถ้าฉันเปลี่ยนชื่อของโพสต์เพื่อสะท้อนว่า?) ดูเหมือนว่าจะมีคุณสมบัติ Fibonacci ที่ f (n-2) + f (n-1) = f (n) ดังนั้นฉันเดาว่านี่คือ ข้อสรุปทั่วไปของลำดับฟีโบนักชี (ฉันไม่แน่ใจว่ามีมาตรฐานทั่วไปหรือไม่)

@ ais523 หากคุณคิดว่าจะปรับปรุงคำถามใช่แล้วคุณอาจเปลี่ยนชื่อโพสต์
Daniel

ฉันคิดว่ามันจะทำให้คำถามค้นหาได้ง่ายขึ้นในอนาคตหากมีคนถามอะไรที่คล้ายกันและทำให้ชัดเจนขึ้นว่าพูดถึงรายการ "ที่เกี่ยวข้อง" ดังนั้นมันจะทำให้คำถามดีขึ้นด้วยการช่วยให้ผู้ตอบถูกที่ถูก

2
@ais ดูเหมือนว่ามีสูตรทั่วไปของ Binet: mathworld.wolfram.com/FibonacciNumber.html
Neil

1
แม้ว่ารหัสกอล์ฟไม่จำเป็นต้องแสดงเหตุผล (ฉันเดา) นี่ดูเหมือนเป็นการดำเนินการที่แปลก ตามที่มันตั้งแต่F_0 = 0และเราควรจะมีF_2 = 1 F_1 = (1/2)(F_0 + F_2) = 1/2
LSpice

คำตอบ:


7

เยลลี่ 5 ไบต์

_Ḟ1+¡

นี่เป็นโซลูชันวนซ้ำโดยไม่มีการติดตั้งภายใน มันใช้การจัดทำดัชนีเช่นเดียวกับสเป็คความท้าทาย

ลองออนไลน์!

พื้นหลัง

ให้fเป็นฟังก์ชันที่กำหนดไว้ในข้อมูลจำเพาะของความท้าทายและฟังก์ชันFของฟีโบนักชีตามปกติ (เช่นกับF (0) = 0 ) สำหรับจำนวนเต็มไม่เป็นลบnเรามีf (n) = F (n + 1) เมื่อ0 ≤ x <1ท้าทายข้อมูลจำเพาะกำหนดf (n + x)เป็นf (n) + (f (n + 1) - f (n)) x

เห็นได้ชัดว่านี้ก็ส่งผลกระทบต่อกรณีฐาน แต่ไม่สูตร recursive คือf (n) = f (n - 1) + f (n - 2)ถือเป็นมันจะสำหรับF ซึ่งหมายความว่าเราสามารถลดความซับซ้อนของคำนิยามสำหรับข้อโต้แย้งที่ไม่ใช่จำนวนเต็มจะได้ง่ายขึ้นf (n) = f (n) + f (n - 1) x

ดังที่คนอื่น ๆ ระบุไว้ในคำตอบความสัมพันธ์แบบวนซ้ำยังมีอาร์กิวเมนต์ที่ไม่ใช่จำนวนเต็ม สิ่งนี้พิสูจน์ได้ง่ายเช่น

พิสูจน์

ตั้งแต่f (0) = f (1) = 1 , Fในอย่างต่อเนื่องในช่วง[0, 1]และf (0 + x) = 1สำหรับทุกx นอกจากนี้f (-1) = F (0) = 0ดังนั้นf (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x กรณีเหล่านี้ฐานครอบคลุมใน[-1, 1)จึงร่วมกับสูตรเวียนเกิดพวกเขาเสร็จสิ้นความหมายของฉ

มันทำงานอย่างไร

เหมือนเมื่อก่อนให้n + xเป็นเพียงอาร์กิวเมนต์เดียวของโปรแกรม monadic ของเรา

¡เป็นอย่างรวดเร็วซึ่งหมายความว่ามันกินเชื่อมโยงบางอย่างไปทางซ้ายและเปลี่ยนพวกเขาเข้าไปในQuickLink ¡โดยเฉพาะการใช้ลิงค์หนึ่งหรือสอง

  • <F:monad|dyad><N:any>เรียกลิงค์Nคืนค่าrและเรียกใช้Fรวมrครั้ง

  • <nilad|missing><F:monad|dyad>ชุดrกับอาร์กิวเมนต์สุดท้ายบรรทัดคำสั่ง (หรือการป้อนข้อมูลจาก STDIN ในกรณีที่ไม่มีของพวกเขา) และดำเนินการFรวมRครั้ง

เนื่องจาก1เป็น nilad (ลิงก์ที่ไม่มีอาร์กิวเมนต์) จึงใช้กรณีที่สองและจะดำเนินการ+ nครั้ง (อาร์กิวเมนต์ที่ไม่ใช่จำนวนเต็มถูกปัดเศษลง) หลังจากการเรียกแต่ละครั้ง+อาร์กิวเมนต์ด้านซ้ายของ quicklink จะถูกแทนที่ด้วยค่าส่งคืนและอาร์กิวเมนต์ด้านขวาด้วยค่าก่อนหน้าของอาร์กิวเมนต์ด้านซ้าย

สำหรับโปรแกรมทั้งหมดให้ทำการอินพุต, ให้ค่าn ; จากนั้น_ลบผลลัพธ์จากอินพุตป้อนค่า ** x ซึ่งกลายเป็นค่าส่งคืน

1+¡จากนั้นเรียก- ตามที่อธิบายไว้ก่อน - ด้วยอาร์กิวเมนต์ซ้าย1 = f (0 + x)และอาร์กิวเมนต์ขวาx = f (-1 + x)ซึ่งคำนวณเอาต์พุตที่ต้องการ


อ่ามีประโยชน์อย่างไรสำหรับความท้าทายของฟีโบนักชี มันมีจุดประสงค์ที่จะมี¡งานอย่างฟีโบนัชชีกับงานเขียนหรือไม่?
Erik the Outgolfer

โอ้ - %1+¡: สอดแทรกเชิงเส้นระหว่างn × F (n)ที่nและn × F (n-1) + F (n)ที่n-εและก้าวขึ้นระหว่างn-εและn
Jonathan Allan

@EriktheOutgolfer ดีไม่มากก็น้อย เนื่องจาก Jelly ไม่มีตัวแปรคุณจะไม่สามารถเข้าถึงสมาชิกลำดับก่อนหน้าได้ดังนั้นคุณควรนำไปใช้ในลักษณะนี้
Dennis

@JanathanAllan ฉันไม่แน่ใจว่าฉันเข้าใจ สิ่งที่%1+¡ควรทำ
Dennis

@Dennis erm, มีความหมายดี \ _o_ / ... แต่นั่นคือสิ่งที่ดูเหมือนจะเกี่ยวกับการทดลอง: D
Jonathan Allan

5

Mathematica ขนาด 32 ไบต์

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

ฟังก์ชั่นที่บริสุทธิ์รับจำนวนจริงไม่ใช่เชิงลบเป็นข้อมูลเข้าและส่งกลับจำนวนจริง หาก1~Max~#ถูกแทนที่ด้วย1นี่จะเป็นนิยามแบบเรียกซ้ำมาตรฐานของหมายเลข Fibonacci 0 ที่จัดทำดัชนีสำหรับอาร์กิวเมนต์จำนวนเต็ม แต่1~Max~#เป็นฟังก์ชั่นเชิงเส้นที่ถูกต้องสำหรับการป้อนค่าจริงระหว่าง 0 และ 2 และการเรียกซ้ำจะดูแลส่วนที่เหลือ (ข้อเท็จจริงเล็กน้อย: การเปลี่ยนสิ่งนี้เป็นหมายเลขฟีโบนัชชี 1 ดัชนีสามารถทำได้โดยเพียงเปลี่ยนMaxa Min!)

ที่สั้นที่สุดที่ฉันจะได้รับกับ builtin เป็น (b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&37



3

JavaScript (ES6), 30 ไบต์

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>

การปรับเปลี่ยนเล็กน้อยของคำนิยามลำดับ Fibonacci แบบเรียกซ้ำที่ทำดัชนี อาจมีข้อผิดพลาดในการปัดเศษเล็กน้อยสำหรับอินพุตบางตัว


นี่คือฉลาด ฉันคิดว่ามันใช้งานไม่ได้
Leun Nun

1

เยลลี่ , 17 12 ไบต์

’Ñ+Ñ
’»0‘ÇỊ?

ลองออนไลน์!

วิธีแก้ปัญหาที่ไม่ได้สร้างขึ้น

คำอธิบาย

ฟังก์ชั่นผู้ช่วย 1Ŀ

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

โปรแกรมหลัก

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

อินพุตในช่วง 0 ถึง 1 จะทำให้อิ่มตัวลบถึง 0 ดังนั้นเราจึงเพิ่ม 1 เพื่อรับ F (0) = F (1) = 1 อินพุตในช่วง 1 ถึง 2 จะกลับมาเอง กรณีพื้นฐานเหล่านั้นเพียงพอที่จะทำการเรียกคืน Fibonacci ทั่วไปและคำนวณค่าอื่น ๆ จากที่นั่น


1

Excel, 137 124 119 113 102 97 ไบต์

วิธีการแบบไม่เรียกซ้ำ / ซ้ำ (คำนวณคำศัพท์ที่ n โดยตรง) วิธีนี้ใช้วิธีที่มีดัชนีเดียว การเพิ่ม+1การ=TRUNC(B1)เปลี่ยนแปลงไปยังการจัดทำดัชนีเป็นศูนย์

=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

โค้ดมีวัตถุประสงค์ที่จะวางเริ่มต้นในเซลล์A1

มือถือเข้าเป็นB1 เซลล์ออกเป็นA1


1

JavaScript (ES6), 67 64 ไบต์

มีปัญหาเล็กน้อยเกี่ยวกับการปัดเศษ

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

ลองมัน

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

เยลลี่ , 13 9 ไบต์

,‘ḞÆḞḅ%1$

สิ่งนี้ใช้การจัดทำดัชนีเดียวกับข้อมูลจำเพาะของความท้าทาย

ลองออนไลน์!

พื้นหลัง

ต่อสเปคเรามีF (x + n) = F (n) + (F (n + 1) - f (n)) x , ธรรมชาติnและ0 ≤ x <1 ตั้งแต่F (1 + n) = F (n) + F (n - 1)นี้สามารถเขียนใหม่เป็นF (x + n) = F (n) + F (n - 1) x

นอกจากนี้การจัดทำดัชนีที่ใช้ในข้อมูลจำเพาะของความท้าทายจะกำหนดฟังก์ชันf (n) = F (n + 1) (โดยที่Fเป็นฟังก์ชัน Fibonacci ปกติเช่นF (0) = 0 ) ดังนั้นเราจึงได้สูตรf (n + x) = f (n + 1) + F (n) x

มันทำงานอย่างไร

,‘ḞÆḞḅ%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 ไบต์

48

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

ลองมัน

38

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

ลองมัน

ขยาย:

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และ$1สั้นสำหรับ$/[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
}

สิ่งนี้ได้แรงบันดาลใจจากPythonและJavascript solutions


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.