Отрицательные числа Фибоначчи


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
Роман Грэф

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

а под CSV вы подразумеваете SSV (значения, разделенные точкой с запятой)?
НХ.

Ответы:


22

Mathematica, 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
(Как) Это также работает для отрицательного ввода?
Роман Грэф,

да, объяснение приходит ...
flawr

это ans(-6)значит быть положительным?
FlipTack

@FlipTack Извините, возможно, это произошло из-за смещения индекса. Я использовал 1-основанный, в то время как вопрос использовал 0-основанный, я исправил это сейчас.
flawr

13

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

 fib

поддерживает положительные и отрицательные числа.

Попробуйте (вставить) на CESGA - Максима на линии


Можете ли вы добавить ссылку на язык?
Павел

Конечно добавили ссылку на онлайн калькулятор!
rahnema1

Также работает над WolframAlpha
Thunda

11

Python, 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

МАТЛ , 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 в 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.87m)
Исмаэль Мигель

@IsmaelMiguel Это должно работать только на Firefox
Конор О'Брайен

Я понятия не имел, это нигде нет
Исмаэль Мигель

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

Lithp , 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.