-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)
буде подібна до Фібоначчі послідовність, що починається з 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)
буде різниця між послідовностями, схожими на Фібонанці, починаючи з 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
:
Без втрати спільності припустимо 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
чи є коли-небудь кілька рішень?