-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 >= 5gibt eine Lösung, a,bdie erfüllt a+b < n:
wenn gerade nist,FIB(0,n/2,3) = n
wenn nungerade ist,FIB(1,(n-1)/2,3) = n
Beweis
Fälle, in denen umfassend n < 5geprüft werden kann.
Angenommen , wir haben zwei minimale Lösungen für n >= 5, a0,b0und a1,b1mit a0 + b0 = a1 + b1und a0 != a1.
Dann gibt es k0,k1so 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,b1und 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) = 0ist , wenn k = 2, so dass die einzige Wahl für k0 = k1ist 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 > a0und 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 DIFF2 positive Ausdrücke und daher sind alle nachfolgenden Ausdrücke positiv.
Wenn also die einzige Zeit , möglich ist es , das DIFF(k) = 0ist k = 1, so dass die einzige Wahl für k0ist 1.
FIB(a0,b0,1) = n
b0 = n
Dies widerspricht Lemma 2.
a>=0unda<bgibt es jemals mehrere Lösungen?