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.