-3 bytes -1 byte graças a ThePirateBay
-8 -9 bytes graças a 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]
Experimente online!
Nota: esta solução depende do fato de nunca haver várias soluções mínimas.
Prova de que nunca existem várias soluções:
Let FIB(a,b,k)Ser a seqüência de Fibonacci-like começando com 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)
Lema 1
A diferença entre sequências do tipo Fibonacci é ela própria do tipo Fibonacci, ie FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k). A prova é deixada ao leitor.
Lema 2
Pois n >= 5, a,bexiste uma solução satisfatória a+b < n:
se né par,FIB(0,n/2,3) = n
se né impar,FIB(1,(n-1)/2,3) = n
Prova
Casos onde n < 5podem ser verificados exaustivamente.
Suponha que tenhamos duas soluções mínimas para n >= 5, a0,b0e a1,b1com a0 + b0 = a1 + b1e a0 != a1.
Então existe k0,k1tal que FIB(a0,b0,k0) = FIB(a1,b1,k1) = n.
Caso 1: k0 = k1
O WLOG assume b0 < b1(e, portanto a0 > a1)
Seja DIFF(k)a diferença entre as seqüências do tipo Fibonnaci começando com a1,b1e a0,b0:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k) (Lema 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
Uma vez que uma sequência semelhante a Fibonnaci tenha 2 termos positivos, todos os termos subsequentes serão positivos.
Assim, o único momento DIFF(k) = 0é quando k = 2, então a única opção k0 = k1é 2.
Assim sendo n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
A minimalidade dessas soluções contradiz o Lema 2.
Caso 2 k0 != k1:
WLOG assume k0 < k1.
Nós temos FIB(a1,b1,k1) = n
Deixei a2 = FIB(a1,b1,k1-k0)
Deixei b2 = FIB(a1,b1,k1-k0+1)
Então FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)(exercício para o leitor)
Como FIB(a1,b1,k)não é negativo para k >= 0, também não é decrescente.
Isso nos dá a2 >= b1 > a0e b2 >= a1+b1 = a0+b0.
Então vamos DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)(Lema 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
Mais uma vez, DIFFpossui 2 termos positivos e, portanto, todos os termos subsequentes são positivos.
Assim, o único momento em que é possível que DIFF(k) = 0é k = 1, por isso, a única opção para k0é 1.
FIB(a0,b0,1) = n
b0 = n
Isso contradiz o lema 2.
a>=0ea<bsempre existem várias soluções?