-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
Как только последовательность, подобная Фибоначчи, имеет 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
есть когда - либо несколько решений?