-3 Bytes -1 Bytes dank ThePirateBay
-8 -9 Bytes dank 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]
Probieren Sie es online!
Hinweis: Diese Lösung beruht auf der Tatsache, dass es niemals mehrere Minimallösungen gibt.
Beweise, dass es nie mehrere Lösungen gibt:
Sei FIB(a,b,k)
die Fibonacci-ähnliche Sequenz beginnend mit 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
Der Unterschied zwischen Fibonacci-ähnlichen Sequenzen ist selbst Fibonacci-ähnlich, dh FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. Der Beweis bleibt dem Leser überlassen.
Lemma 2
Denn es n >= 5
gibt eine Lösung, a,b
die erfüllt a+b < n
:
wenn gerade n
ist,FIB(0,n/2,3) = n
wenn n
ungerade ist,FIB(1,(n-1)/2,3) = n
Beweis
Fälle, in denen umfassend n < 5
geprüft werden kann.
Angenommen , wir haben zwei minimale Lösungen für n >= 5
, a0,b0
und a1,b1
mit a0 + b0 = a1 + b1
und a0 != a1
.
Dann gibt es k0,k1
so etwas FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Fall 1: k0 = k1
WLOG annehmen b0 < b1
(und daher a0 > a1
)
Sei DIFF(k)
der Unterschied zwischen den Fibonnaci-ähnlichen Sequenzen beginnend mit a1,b1
und 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
Sobald eine Fibonnaci-ähnliche Sequenz 2 positive Terme hat, sind alle nachfolgenden Terme positiv.
Somit ist die einzige Zeit DIFF(k) = 0
ist , wenn k = 2
, so dass die einzige Wahl für k0 = k1
ist 2
.
Deshalb n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
Die Minimalität dieser Lösungen widerspricht Lemma 2.
Fall 2 k0 != k1
:
WLOG annehmen k0 < k1
.
Wir haben FIB(a1,b1,k1) = n
Lassen a2 = FIB(a1,b1,k1-k0)
Lassen b2 = FIB(a1,b1,k1-k0+1)
Dann FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(Übung für den Leser)
Da FIB(a1,b1,k)
es für nicht negativ ist k >= 0
, ist es auch nicht abnehmend.
Das gibt uns a2 >= b1 > a0
und b2 >= a1+b1 = a0+b0
.
Dann lass 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
Hat wieder DIFF
2 positive Ausdrücke und daher sind alle nachfolgenden Ausdrücke positiv.
Wenn also die einzige Zeit , möglich ist es , das DIFF(k) = 0
ist k = 1
, so dass die einzige Wahl für k0
ist 1
.
FIB(a0,b0,1) = n
b0 = n
Dies widerspricht Lemma 2.
a>=0
unda<b
gibt es jemals mehrere Lösungen?