Numeri di Fibonacci negativi


28

Probabilmente tutti conoscete la sequenza dei fibonacci:

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

Il tuo compito è semplice come potrebbe essere:

  • Dato Ncalcolo interofibonacci(n)

ma ecco il colpo di scena:

  • Anche fare negativo N

Aspettare. Che cosa?

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

così

fibonacci(-1)=1

e

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

e così via...

  • Questo è un quindi il programma più breve in byte vince.
  • È possibile inviare una funzione o un programma completo
  • N è in [-100.100]

Testcase 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

Suggerimento:

n <0 e n & 1 == 0:

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


No. Il mio vuole che anche tu supporti numeri negativi.
Roman Gräf,

7
Penso che questo non sia un imbecille. Delle risposte sulla prima pagina della sfida esistente di Fibonacci, solo 1 può gestire i negativi e tutto il resto dovrebbe essere modificato in modo significativo per tornare indietro.
xnor

Aggiunti alcuni. Sentiti libero di aggiungere altro. @Flip
Roman Gräf

1
Leggi questo meta post sulla formattazione dei casi di test: cerca di evitare tabelle elaborate
FlipTack

e per CSV intendi SSV (valori separati da punto e virgola)?
NH.

Risposte:


22

Mathematica, 9 byte

Fibonacci

Sì, questa funzione integrata supporta numeri negativi.


2
Questa è quasi la parola per parola la risposta che stavo venendo a postare: D
Greg Martin,

17

Ottava, 20 byte

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

Provalo online!

Spiegazione

Questo fa uso del fatto che la sequenza fibonacci f(n)può essere scritta come (questa dovrebbe essere una notazione vettoriale a matrice):

ricorsivamente:

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

esplicitamente:

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

Ciò significa che l'entrata in alto a destra di questa matrice nella potenza di nè il valore f(n)che stiamo cercando. Ovviamente possiamo anche invertire questa matrice in quanto ha un rango completo e la relazione descrive ancora la stessa relazione di ricorrenza. Ciò significa che funziona anche per input negativi.


1
(Come) Funziona anche con input negativi?
Roman Gräf,

sì, spiegazione in arrivo ...
flawr

è ans(-6)pensato per essere positivo?
FlipTack il

@FlipTack Siamo spiacenti, potrebbe essere stato a causa dello spostamento dell'indice. Ho usato 1-based, mentre la domanda utilizzava 0-based, l'ho risolto ora.
flawr


11

Python, 43 byte

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

Una formula diretta con il rapporto aureo g. Con fla funzione sopra:

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

Stessa lunghezza alt, aliasing solo la radice quadrata di 5:

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

Non ho visto un modo per fare una funzione ricorsiva in grado di competere con questi. Un tentativo leggermente golfato per 57 byte:

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

Per confronto, un metodo iterativo (60 byte in Python 2):

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

Oppure, per 58 byte:

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

10

JavaScript (ES6), 42 byte

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

Test


Mi piace molto la tua funzione. Ho avuto un suggerimento qui, ma ho trascurato un -, quindi non avrebbe funzionato ...
Luca

5

MATL , 11 9 byte

Sono contento di ciò [3,2], che sicuramente potrebbe essere giocato a golf, se qualcuno conosce un modo per favore fammi sapere =) ([1,3] Funzionerebbe anche con .) Grazie @LuisMendo per -2 byte =)

IHhBiY^2)

Questo utilizza lo stesso approccio di Octave annswer . Ma per generare la matrice

[1,1]
[1,0]

convertiamo semplicemente il numero 3e 2da decimale a binario (cioè 11e 10).

Provalo online!


5

JavaScript (ES7) 37 byte

Usa la formula di Binet .

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

Emette il nesimo numero di Fibonacci + - 0.0000000000000005.


**richiede ES7.
Neil,

Oh, pensavo facesse parte di ES6, ma hai ragione. Modificato Ho anche usato un'altra versione della formula di Binet per un salvataggio di 1B.
Luca

Ora che ci penso, basta usare 1-pinvece di -1/pdovrebbe aver funzionato per lo stesso risparmio.
Neil,

3

Jolf, 2 byte

mL

Provalo qui!

Il fibonacci incorporato, implementato usando la phiformula.


Uncaught SyntaxError: token imprevisto | at new Function (<anonymous>) at p (math.min.js: 27) at Object (math.min.js: 27) at digitato (eval at p (math.min.js: 27), <anonymous>: 36:14) at Object.n [come factory] (math.min.js: 45) at t (math.min.js: 27) at f (math.min.js: 27) at Object.get [come mediana ] (math.min.js: 27) su clone (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) su rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf. js: 2128 (Google Chrome più recente, versione 55.0.2883.87m)
Ismael Miguel,

@IsmaelMiguel Questo dovrebbe funzionare solo su Firefox
Conor O'Brien il

Non ne avevo idea, non è da nessuna parte
Ismael Miguel,

2

Haskell, 51 byte

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

1
Più test all'interno di una guardia può essere combinato con ,al posto di &&: even z,z<0.
nimi,

1

PowerShell , 112 byte

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 Call:

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

Uscita della 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

1

Lithp , 88 byte

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

Il mio sguardo su tutte quelle parentesi .

Provalo online!

Non molto piccolo davvero. Al momento esiste un bug di analisi che richiede uno da utilizzare (get N)o (+ N)semplicemente N. Ho scelto quello più piccolo. Tuttavia, non credo che ci sia qualcosa che si possa fare ulteriormente per giocare a golf.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.