Ujemne liczby Fibonacciego

28

Prawdopodobnie wszyscy znacie sekwencję Fibonacciego:

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

Twoje zadanie jest tak proste, jak mogłoby być:

  • Biorąc pod uwagę całkowitą Nobliczeniowychfibonacci(n)

ale oto zwrot akcji:

  • Zrób też negatywne N

Czekać. Co?

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

więc

fibonacci(-1)=1

i

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

i tak dalej...

  • Jest to więc wygrywa najkrótszy program w bajtach.
  • Możesz przesłać funkcję lub pełny program
  • N jest w [-100,100]

Przypadki testowe w 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

Wskazówka:

n <0 oraz n & 1 == 0:

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

Roman Gräf
źródło
Nie. Mój chce, żebyś również obsługiwał liczby ujemne.
Roman Gräf
7
Myślę, że to nie jest dupek. Z odpowiedzi na pierwszej stronie istniejącego wyzwania Fibonacciego tylko 1 radzi sobie z negatywami, a cała reszta musiałaby zostać znacznie zmieniona, aby cofnąć się również.
xnor
Dodano trochę. Dodaj więcej. @Flip
Roman Gräf
1
Przeczytaj ten meta post o formatowaniu przypadków testowych: staraj się unikać fantazyjnych tabel
FlipTack
a przez CSV masz na myśli SSV (wartości oddzielone średnikami)?
NH.

Odpowiedzi:

22

Mathematica, 9 bajtów

Fibonacci

Tak, ta wbudowana funkcja obsługuje liczby ujemne.

alephalpha
źródło
2
To prawie słowo w słowo odpowiedź, którą zamierzałem napisać: D
Greg Martin
17

Oktawa, 20 bajtów

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

Wypróbuj online!

Wyjaśnienie

Wykorzystuje to fakt, że sekwencję Fibonacciego f(n)można zapisać jako (powinna to być notacja wektora macierzy):

Rekurencyjnie:

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

Wyraźnie:

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

Oznacza to, że górny prawy wpis tej macierzy do potęgi njest wartością f(n), której szukamy. Oczywiście możemy również odwrócić tę macierz, ponieważ ma ona pełną rangę, a związek nadal opisuje tę samą relację powtarzalności. Oznacza to, że działa również w przypadku negatywnych danych wejściowych.

wada
źródło
1
(Jak) Czy to działa również w przypadku negatywnych danych wejściowych?
Roman Gräf
tak, wyjaśnienie nadchodzi ...
flawr
to ans(-6)ma być pozytywny?
FlipTack,
@FlipTack Przepraszamy, mogło to być spowodowane zmianą indeksu. Użyłem opartej na 1, a pytanie użyłem opartej na 0, naprawiłem to teraz.
flawr
13

Maxima, 3 bajty

 fib

obsługuje liczby dodatnie i ujemne.

Wypróbuj (wklej) na CESGA - Maxima on line

rahnema1
źródło
Czy możesz dodać link do języka?
Pavel
Oczywiście dodano link do kalkulatora online!
rahnema1
Działa również na WolframAlpha
Thunda
11

Python, 43 bajty

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

Bezpośrednia formuła ze złotym współczynnikiem g. Dzięki fpowyższej funkcji:

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

Ta sama długość alt, tylko aliasing pierwiastka kwadratowego z 5:

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

Nie widziałem sposobu, aby stworzyć funkcję rekurencyjną, która mogłaby z nimi konkurować. Łagodna próba golfa dla 57 bajtów:

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

Dla porównania, metoda iteracyjna (60 bajtów w Pythonie 2):

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

Lub dla 58 bajtów:

n=input()
a,b=0,1;exec"a,b=b,a+cmp(n,0)*b;"*abs(n)
print a
xnor
źródło
10

JavaScript (ES6), 42 bajty

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

Test

Arnauld
źródło
Naprawdę podoba mi się twoja funkcja. Miałem tutaj sugestię, ale przeoczyłem -, więc to nie zadziała ...
Luke
5

MATL , 11 9 bajtów

Cieszę się, że na [3,2]pewno można grać w golfa, jeśli ktoś zna sposób, proszę dać mi znać =) (To też zadziała [1,3].) Dzięki @LuisMendo za -2 bajty =)

IHhBiY^2)

Jest to takie samo podejście jak w przypadku odpowiedzi Octave . Ale generowanie macierzy

[1,1]
[1,0]

po prostu Conver numer 3i 2od dziesiętnej na binarną (tzn 11a 10).

Wypróbuj online!

wada
źródło
5

JavaScript (ES7) 37 bajtów

Używa Formuły Bineta .

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

To daje liczbę nth Fibonacciego + - 0.0000000000000005.

Luke
źródło
**wymaga ES7.
Neil
Och, myślałem, że to część ES6, ale masz rację. Zmieniłem to. Użyłem też innej wersji Formuły Bineta do zapisania 1B.
Łukasz
Teraz, gdy o tym myślę, samo użycie 1-pzamiast -1/ppowinno działać dla tej samej oszczędności.
Neil
3

Jolf, 2 bajty

mL

Wypróbuj tutaj!

Wbudowane fibonacciego, zaimplementowane przy użyciu phiformuły.

Conor O'Brien
źródło
Uncaught SyntaxError: Nieoczekiwany token | w nowej funkcji (<anonimowy>) w p (math.min.js: 27) w Object (math.min.js: 27) w typed (eval w p (math.min.js: 27), <anonymous>: 36:14) w Object.n [as factory] (math.min.js: 45) at t (math.min.js: 27) at f (math.min.js: 27) w Object.get [jako mediana ] (math.min.js: 27) w klon (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) w rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf. js: 2128 (najnowszy Google Chrome, wersja 55.0.2883.87m)
Ismael Miguel
@ IsmaelMiguel To powinno działać tylko na firefoxie
Conor O'Brien
Nie miałem pojęcia, nigdzie nie ma
Ismael Miguel
2

Haskell, 51 bajtów

s=0:scanl(+)1s;f z|even z,z<0= -f(-z);f z=s!!abs z
Roman Czyborra
źródło
1
Wielokrotne testy w straży mogą być łączone ze ,zamiast &&: even z,z<0.
nimi
1

PowerShell , 112 bajtów

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

Połączenie demo:

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

Wyjście z wersji demonstracyjnej:

-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
JohnLBevan
źródło
1

Lithp , 88 bajtów

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

Moje spojrzenie na wszystkie te nawiasy .

Wypróbuj online!

Naprawdę niezbyt małe. Obecnie występuje błąd analizowania, który wymaga użycia (get N)lub (+ N)zamiast po prostu N. Wybrałem mniejszy. Nie sądzę jednak, aby można było coś takiego zrobić w golfa.

Andrakis
źródło