Негативні числа Фібоначчі


28

Ви, напевно, всі знаєте послідовність рівня:

fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)
fibonacci(0)=0
fibonacci(1)=1

Ваше завдання таке просте, як це могло бути:

  • Дано Nобчислення цілих чиселfibonacci(n)

але ось поворот:

  • Також роби негатив N

Зачекайте. Що?

fibonacci(1)=fibonacci(0)+fibonacci(-1)

так

fibonacci(-1)=1

і

fibonacci(-2)=fibonacci(0)-fibonacci(1)=-1

і так далі...

  • Це тому найкоротша програма виграти в байтах.
  • Ви можете подати функцію або повну програму
  • N знаходиться в [-100,100]

Тестовий зразок у форматі CSV:

-9;-8;-7;-6;-5;-4;-3;-2;-1;0;1;2;3;4;5;6;7;8
34;-21;13;-8;5;-3;2;-1;1;0;1;1;2;3;5;8;13;21

Підказка:

n <0 і n & 1 == 0:

fibonacci(n)=fibonacci(abs(n))*-1


Ні. Мої хочуть, щоб ви також підтримували негативні числа.
Роман Ґраф

7
Я думаю, що це не дура. З відповідей на першій сторінці існуючого виклику Фібоначчі лише 1 може впоратися з негативами, а все інше потрібно суттєво змінити, щоб також піти назад.
xnor

Додано кілька. Сміливо додайте більше. @Flip
Roman Gräf

1
Прочитайте цей мета-пост про форматування тестових випадків: намагайтеся уникати фантазійних таблиць
FlipTack

а під CSV ви маєте на увазі SSV (значення, розділені крапкою з комою)?
NH.

Відповіді:


22

Математика, 9 байт

Fibonacci

Так, ця вбудована функція підтримує від’ємні числа.


2
Це майже відповідь за словом, відповідь, яку я приходив до повідомлення: D
Грег Мартін

17

Октава, 20 байт

 @(n)([1,1;1,0]^n)(2)

Спробуйте в Інтернеті!

Пояснення

Це використовує той факт, що послідовність напруженості f(n)може бути записана як (це має бути матрична векторна позначення):

Рекурсивно:

[f(n+1)]  = [1  1] * [f(n)  ]
[f(n)  ]    [1  0]   [f(n-1)]

Явно:

[f(n+1)]  = [1  1] ^n * [1]
[f(n)  ]    [1  0]      [0]

Це означає, що правий верхній запис цієї матриці на потужність n- це значення, яке f(n)ми шукаємо. Очевидно, ми можемо також перевернути цю матрицю, оскільки вона має повний ранг, і співвідношення все ще описує те саме відношення повторення. Це означає, що він також працює для негативних входів.


1
(Як) Це також працює для негативного введення?
Роман Ґраф

так, пояснення приходить ...
недолік

це ans(-6)значить бути позитивним?
FlipTack

@FlipTack Вибачте, це могло бути через зміщення індексу. Я використовував 1-базі, тоді як питання використовував 0-основі, я його виправив зараз.
недолік

13

Максима, 3 байти

 fib

підтримує додатні та від’ємні числа.

Спробуйте (вставити) на CESGA - Maxima on line


Чи можете ви додати посилання на мову?
Павло

Звичайно додано посилання на онлайн-калькулятор!
rahnema1

Також працює над WolframAlpha
Thunda

11

Пітон, 43 байти

g=5**.5/2+.5
lambda n:(g**n-(1-g)**n)/5**.5

Пряма формула із золотим співвідношенням g. За fдопомогою наведеної вище функції:

for n in range(-10,11):print f(n) 

-55.0
34.0
-21.0
13.0
-8.0
5.0
-3.0
2.0
-1.0
1.0
0.0
1.0
1.0
2.0
3.0
5.0
8.0
13.0
21.0
34.0
55.0

Таку ж довжину alt, лише псевдонім квадратного кореня 5:

a=5**.5
lambda n:((a+1)**n-(1-a)**n)/a/2**n

Я не бачив способу зробити рекурсивну функцію, яка могла б конкурувати з ними. Легка спроба гольфу на 57 байт:

f=lambda n:n<0and(-1)**n*f(-n)or n>1and f(n-1)+f(n-2)or n

Для порівняння, ітераційний метод (60 байт у Python 2):

n=input()
a,b=0,1;exec"a,b=b,a+b;"*n+"a,b=b-a,a;"*-n
print a

Або для 58 байт:

n=input()
a,b=0,1;exec"a,b=b,a+cmp(n,0)*b;"*abs(n)
print a

10

JavaScript (ES6), 42 байти

f=n=>n<2?n<0?f(n+2)-f(n+1):n:f(n-2)+f(n-1)

Тест


Мені дуже подобається ваша функція. Я мав тут пропозицію, але я не помітив: - так що це не вийде ...
Лука

5

MATL , 11 9 байт

Я радий тому [3,2], що, безумовно, може бути поле для гольфу, якщо хтось знає спосіб, будь ласка, дайте мені знати =) (Це також би працювало [1,3].) Дякую @LuisMendo за -2 байт =)

IHhBiY^2)

Для цього використовується той же підхід, що і у відповіді на Octave . Але для генерації матриці

[1,1]
[1,0]

ми просто перетворюємо число 3і 2від десяткової до двійкової (тобто 11і 10).

Спробуйте в Інтернеті!


5

JavaScript (ES7) 37 байт

Використовує формулу Біне .

n=>((1+(a=5**.5))**n-(1-a)**n)/a/2**n

Це виводить nго числа Фібоначчі + - 0.0000000000000005.


**вимагає ES7.
Ніл

О, подумав, що це частина ES6, але ти маєш рацію. Змінив це. Я також використовував іншу версію формули Біне для збереження 1B.
Лука

Тепер, коли я замислююся над цим, просто використання 1-pзамість цього -1/pмало б працювати для тієї ж економії.
Ніл

3

Джольф, 2 байти

mL

Спробуйте тут!

Вбудований модуль, реалізований за phiформулою.


Uncaught SyntaxError: Несподіваний маркер | у новій функції (<anonymous>) у p (math.min.js: 27) у Object (math.min.js: 27) набрано (eval at p (math.min.js: 27), <anonymous>: 36:14) на Object.n [як завод] (math.min.js: 45) в t (math.min.js: 27) в f (math.min.js: 27) на Object.get [як медіана ] (math.min.js: 27) у клоні (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) на rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf. js: 2128 (остання версія Google Chrome, версія 55.0.2883.87 м)
Ісмаель Мігель

@IsmaelMiguel Це повинно працювати лише на firefox
Conor O'Brien

Я не мав уявлення, це ніде
Ісмаїл Мігель

2

Haskell, 51 байт

s=0:scanl(+)1s;f z|even z,z<0= -f(-z);f z=s!!abs z

1
Кілька тести в межах огорожі , може бути об'єднані з ,замість &&: even z,z<0.
німі

1

PowerShell , 112 байт

function f($n){$o=('-','+')[$n-lt0];&(({$a,$b=(2,1|%{f("$n$o$_"|iex)});"$a- $o$b"|iex},{$n*$n})[$n-in(-1..1)])}

Демо-дзвінок:

-9..9 | %{"{0,2}`t=> {1,3}" -f $_,(f($_))} 

Вихід демонстрації:

-9  =>  34
-8  => -21
-7  =>  13
-6  =>  -8
-5  =>   5
-4  =>  -3
-3  =>   2
-2  =>  -1
-1  =>   1
 0  =>   0
 1  =>   1
 2  =>   1
 3  =>   2
 4  =>   3
 5  =>   5
 6  =>   8
 7  =>  13
 8  =>  21
 9  =>  34

1

Літп , 88 байт

#N::((if(< N 2)((if(< N 0)((-(f(+ N 2))(f(+ N 1))))((+ N))))((+(f(- N 2))(f(- N 1))))))

Мій погляд на всі ці дужки .

Спробуйте в Інтернеті!

Не дуже маленький насправді. Наразі виправлена ​​помилка для аналізу, яку потрібно використовувати (get N)або (+ N)замість просто N. Я вибрав менший. Однак я не думаю, що можна щось зробити для того, щоб пограти в гольф.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.