-3バイト -1バイトThePirateBayのおかげ
-8 -9ニールのおかげでバイト。
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)
フィボナッチのようなシーケンスで始まる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
徹底的に確認できるケース。
我々は2つの最小限のソリューションを持っていると仮定し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)
とで始まるフィボナッチのようなシーケンスの違いに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
はwhen 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
はありますか?