-3 ไบต์ -1 ไบต์ขอบคุณ ThePirateBay
-8 -9 ไบต์ขอบคุณ Neil
f=(n,a=1,b=0,c=(a,b)=>b<n?c(a+b,a):b>n)=>c(a,b)?b+2<a?f(n,a-1,b+1):f(n,b-~a):[b,a]
ลองออนไลน์!
หมายเหตุ: การแก้ปัญหานี้ขึ้นอยู่กับความจริงที่ว่าไม่มีวิธีการแก้ปัญหาน้อยที่สุด
พิสูจน์ว่าไม่มีทางแก้ไขหลายทาง:
อนุญาตFIB(a,b,k)
เป็นลำดับ Fibonacci เหมือนเริ่มต้นด้วยa,b
:
FIB(a,b,0) = a
FIB(a,b,1) = b
FIB(a,b,k) = FIB(a,b,k-1) + FIB(a,b,k-2)
บทแทรก 1
FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
ความแตกต่างระหว่างฟีโบนักชีเหมือนลำดับฟีโบนักชีเป็นตัวเองเหมือนเช่น หลักฐานที่เหลือให้ผู้อ่าน
บทแทรก 2
สำหรับn >= 5
การแก้ปัญหาที่a,b
มีอยู่น่าพอใจa+b < n
:
ถ้าn
เป็นเช่นนั้นFIB(0,n/2,3) = n
ถ้าn
แปลกFIB(1,(n-1)/2,3) = n
พิสูจน์
กรณีที่n < 5
สามารถตรวจสอบได้อย่างละเอียดถี่ถ้วน
สมมติว่าเรามีสองโซลูชั่นน้อยที่สุดสำหรับn >= 5
, a0,b0
และa1,b1
ด้วยและa0 + b0 = a1 + b1
a0 != a1
จากนั้นก็มีอยู่เช่นนั้นk0,k1
FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
กรณีที่ 1: k0 = k1
WLOG ถือว่าb0 < b1
(และดังนั้นa0 > a1
)
ให้DIFF(k)
เป็นความแตกต่างระหว่างลำดับเหมือน Fibonnaci เริ่มต้นด้วยa1,b1
และa0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(บทแทรก 1)
DIFF(0) = a1 - a0 < 0
DIFF(1) = b1 - b0 > 0
DIFF(2) = (a1+b1) - (a0+b0) = 0
DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0
DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0
เมื่อลำดับเหมือน Fibonnaci มี 2 คำบวกทุกคำที่ตามมาจะเป็นบวก
ดังนั้นเวลาเท่านั้น DIFF(k) = 0
คือเมื่อk = 2
เพื่อให้เป็นทางเลือกสำหรับเป็นk0 = k1
2
ดังนั้น n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
การย่อขนาดของโซลูชันเหล่านี้ขัดแย้งกับเลมม่า 2
กรณีที่ 2: k0 != k1
::
WLOG ถือว่า k0 < k1
ถือว่า
เรามี FIB(a1,b1,k1) = n
ปล่อย a2 = FIB(a1,b1,k1-k0)
ปล่อย b2 = FIB(a1,b1,k1-k0+1)
แล้วก็ FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(ออกกำลังกายสำหรับผู้อ่าน)
เนื่องจากFIB(a1,b1,k)
ไม่ใช่เชิงลบสำหรับk >= 0
จึงไม่ลดลงเช่นกัน
สิ่งนี้ทำให้เราa2 >= b1 > a0
และb2 >= a1+b1 = a0+b0
และ
จากนั้นให้DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(เล็มม่า 1)
DIFF(0) = a2 - a0 > 0
DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0
DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0
DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0
อีกครั้ง DIFF
มี 2 คำบวกและดังนั้นคำที่ตามมาทั้งหมดจะเป็นบวก
ดังนั้นเพียงครั้งเดียวเมื่อมันเป็นไปได้ว่าDIFF(k) = 0
จะเป็นk = 1
เพื่อให้เป็นทางเลือกสำหรับมีk0
1
FIB(a0,b0,1) = n
b0 = n
สิ่งนี้ขัดแย้งกับเลมม่า 2
a>=0
และa<b
จะมีวิธีแก้ปัญหาที่หลากหลาย?