Negative Fibonacci-Zahlen

28

Sie kennen wahrscheinlich alle die Fibonacci-Sequenz:

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

Ihre Aufgabe ist so einfach wie möglich:

  • Gegebenen ganzzahligen NRechenfibonacci(n)

aber hier ist die Wendung:

  • Auch negativ machen N

Warten. Was?

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

so

fibonacci(-1)=1

und

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

und so weiter...

  • Dies ist ein so dass das kürzeste Programm in Bytes gewinnt.
  • Sie können eine Funktion oder ein vollständiges Programm einreichen
  • N ist in [-100,100]

Testfälle in 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

Hinweis:

n <0 und n & 1 == 0:

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

Roman Gräf
quelle
Nein, ich möchte, dass Sie auch negative Zahlen unterstützen.
Roman Gräf
7
Ich denke, das ist kein Betrug. Von den Antworten auf der ersten Seite der vorhandenen Fibonacci-Herausforderung kann nur 1 mit Negativen umgehen, und der Rest müsste erheblich geändert werden, um auch rückwärts zu gehen.
xnor
Einige hinzugefügt. Fühlen Sie sich frei, um mehr hinzuzufügen. @Flip
Roman Gräf
1
Lesen Sie diesen Meta-Beitrag zum Formatieren von Testfällen: Vermeiden Sie ausgefallene Tabellen
FlipTack
und mit CSV meinst du SSV (durch Semikolon getrennte Werte)?
NH.

Antworten:

22

Mathematica, 9 Bytes

Fibonacci

Ja, diese integrierte Funktion unterstützt negative Zahlen.

Alephalpha
quelle
2
Dies ist fast wörtlich die Antwort, die ich veröffentlichen wollte: D
Greg Martin
17

Oktave, 20 Bytes

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

Probieren Sie es online!

Erläuterung

Dies nutzt die Tatsache, dass die Fibonacci-Sequenz f(n)wie folgt geschrieben werden kann (dies sollte eine Matrixvektor-Notation sein):

Rekursiv:

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

Ausdrücklich:

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

Dies bedeutet, dass der obere rechte Eintrag dieser Matrix zur Potenz von ndem Wert ist, den f(n)wir suchen. Natürlich können wir diese Matrix auch invertieren, da sie den vollen Rang hat und die Beziehung immer noch dieselbe Wiederholungsbeziehung beschreibt. Das heißt, es funktioniert auch für negative Eingänge.

fehlerhaft
quelle
1
(Wie) Funktioniert das auch bei negativen Eingaben?
Roman Gräf
Ja, Erklärung kommt ...
Fehler
wird ans(-6)sein soll positiv?
FlipTack
@FlipTack Entschuldigung, möglicherweise liegt es an der Indexverschiebung. Ich habe 1-basiert verwendet, während die Frage 0-basiert verwendet hat, habe ich sie jetzt behoben.
Fehler
13

Maxima, 3 Bytes

 fib

unterstützt positive und negative Zahlen.

Probieren Sie es (Paste) auf CESGA - Maxima online

rahnema1
quelle
Können Sie der Sprache einen Link hinzufügen?
Pavel
Natürlich einen Link zu einem Online-Rechner hinzugefügt!
rahnema1
Funktioniert auch auf WolframAlpha
Thunda
11

Python, 43 Bytes

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

Eine direkte Formel mit dem goldenen Schnitt g. Mit fder obigen Funktion:

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

Gleiche Länge alt, nur Aliasing der Quadratwurzel von 5:

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

Ich habe keine Möglichkeit gesehen, eine rekursive Funktion zu erstellen, die mit diesen konkurrieren könnte. Ein leicht golfener Versuch für 57 Bytes:

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

Zum Vergleich eine iterative Methode (60 Bytes in Python 2):

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

Oder für 58 Bytes:

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

JavaScript (ES6), 42 Byte

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

Prüfung

Arnauld
quelle
Ich mag deine Funktion wirklich. Ich hatte hier einen Vorschlag, aber ich habe ein - übersehen, damit es nicht funktioniert ...
Luke
5

MATL , 11 9 Bytes

Ich freue mich über die [3,2], die sicherlich Golf spielen könnten, wenn jemand einen Weg kennt, lass es mich bitte wissen =) (Es würde auch funktionieren [1,3].) Danke @LuisMendo für -2 Bytes =)

IHhBiY^2)

Dies ist derselbe Ansatz wie der Octave-Annswer . Aber um die Matrix zu generieren

[1,1]
[1,0]

Wir konvertieren nur die Zahl 3und 2von dezimal nach binär (dh 11und 10).

Probieren Sie es online!

fehlerhaft
quelle
5

JavaScript (ES7) 37 Byte

Verwendet die Binet-Formel .

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

Dies gibt die nth Fibonacci-Zahl + - aus 0.0000000000000005.

Luke
quelle
**benötigt ES7.
Neil
Oh, ich dachte es wäre Teil von ES6, aber du hast recht. Änderte es. Ich habe auch eine andere Version von Binets Formula verwendet, um 1B zu speichern.
Luke
Jetzt, wo ich darüber nachdenke, hätte es für die gleiche Ersparnis funktionieren sollen , einfach 1-pstatt zu -1/pverwenden.
Neil
3

Jolf, 2 Bytes

mL

Probieren Sie es hier aus!

Das eingebaute Fibonacci, implementiert mit der phiFormel.

Conor O'Brien
quelle
Nicht erfasster Syntaxfehler: Unerwartetes Token | at new Function (<anonym>) at p (math.min.js: 27) at Object (math.min.js: 27) at typed (eval at p (math.min.js: 27), <anonym>: 36:14) bei Object.n [as factory] (math.min.js: 45) bei t (math.min.js: 27) bei f (math.min.js: 27) bei Object.get [as median ] (math.min.js: 27) bei clone (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) bei rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf. js: 2128 (Neueste Google Chrome, Version 55.0.2883.87m)
Ismael Miguel
@IsmaelMiguel Dies sollte nur auf Firefox funktionieren
Conor O'Brien
Ich hatte keine Ahnung, es ist nirgendwo
Ismael Miguel
2

Haskell, 51 Bytes

s=0:scanl(+)1s;f z|even z,z<0= -f(-z);f z=s!!abs z
Roman Czyborra
quelle
1
Mehrere Tests innerhalb einer Wache kann kombiniert werden mit ,statt &&: even z,z<0.
nimi
1

PowerShell , 112 Bytes

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

Demo-Aufruf:

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

Ausgabe der Demo:

-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
quelle
1

Lithp , 88 Bytes

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

Mein Blick auf all diese Klammern .

Probieren Sie es online!

Eigentlich nicht sehr klein. Derzeit ist ein Parsing-Fehler aufgetreten, für dessen Verwendung (get N)oder (+ N)anstelle von "Einfach" ein Fehler erforderlich ist N. Ich habe den kleineren gewählt. Ich glaube jedoch nicht, dass es irgendetwas gibt, was man tun könnte, um dies zu verbessern.

Andrakis
quelle