-3 byte -1 byte grazie a ThePirateBay
-8 -9 byte grazie 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]
Provalo online!
Nota: questa soluzione si basa sul fatto che non esistono mai più soluzioni minime.
Prova che non ci sono mai più soluzioni:
Lascia che FIB(a,b,k)
sia la sequenza simile a Fibonacci che inizia con 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)
Lemma 1
La differenza tra sequenze simili a Fibonacci è di per sé simile a Fibonacci, cioè FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. La prova è lasciata al lettore.
Lemma 2
Perché esiste n >= 5
una soluzione a,b
soddisfacente a+b < n
:
se n
è pari,FIB(0,n/2,3) = n
se n
è dispari,FIB(1,(n-1)/2,3) = n
Prova
Casi in cui n < 5
può essere verificato in modo esauriente.
Supponiamo di avere due soluzioni minime per n >= 5
, a0,b0
e a1,b1
con a0 + b0 = a1 + b1
e a0 != a1
.
Quindi esiste k0,k1
tale FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Caso 1: k0 = k1
WLOG assume b0 < b1
(e quindi a0 > a1
)
Lascia che DIFF(k)
sia la differenza tra le sequenze simili a Fibonnaci che iniziano con a1,b1
e a0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lemma 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
Una volta che una sequenza simile a Fibonnaci ha 2 termini positivi, tutti i termini successivi sono positivi.
Pertanto, l'unica volta DIFF(k) = 0
è quando k = 2
, quindi l'unica scelta k0 = k1
è 2
.
Perciò n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
La minimalità di queste soluzioni contraddice Lemma 2.
Caso 2 k0 != k1
::
WLOG assume k0 < k1
.
abbiamo FIB(a1,b1,k1) = n
Permettere a2 = FIB(a1,b1,k1-k0)
Permettere b2 = FIB(a1,b1,k1-k0+1)
Quindi FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(esercizio per il lettore)
Poiché FIB(a1,b1,k)
non è negativo per k >= 0
, è anche non decrescente.
Questo ci dà a2 >= b1 > a0
e b2 >= a1+b1 = a0+b0
.
Quindi lascia DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lemma 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
Ancora una volta, DIFF
ha 2 termini positivi e quindi tutti i termini successivi sono positivi.
Così, l'unico momento in cui è possibile che DIFF(k) = 0
è k = 1
, così l'unica scelta per k0
è 1
.
FIB(a0,b0,1) = n
b0 = n
Questo contraddice Lemma 2.
a>=0
ea<b
ci sono mai più soluzioni?