-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)
以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
曾经有多种解决方案?