Números negativos de Fibonacci


28

Probablemente todos conozcan la secuencia de Fibonacci:

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

Su tarea es tan simple como podría ser:

  • Dada número entero Nde cómputofibonacci(n)

pero aquí está el giro:

  • También hacer negativo N

Espere. ¿Qué?

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

asi que

fibonacci(-1)=1

y

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

y así...

  • Este es un por lo que el programa más corto en bytes gana.
  • Puede enviar una función o un programa completo
  • N está en [-100,100]

Testcase (s) en 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

Insinuación:

n <0 y n & 1 == 0:

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


No. El mío también quiere que apoyes números negativos.
Roman Gräf

77
Creo que esto no es un engaño. De las respuestas en la primera página del desafío existente de Fibonacci, solo 1 puede manejar los negativos, y todo el resto necesitaría ser cambiado significativamente para ir hacia atrás también.
xnor

Se agregaron algunos. Siéntase libre de agregar más. @Flip
Roman Gräf

1
Lea esta meta publicación sobre formatear casos de prueba: trate de evitar tablas elegantes
FlipTack

y por CSV te refieres a SSV (valores separados por punto y coma)?
NH.

Respuestas:


22

Mathematica, 9 bytes

Fibonacci

Sí, esta función integrada admite números negativos.


2
Esta es casi palabra por palabra la respuesta que venía a publicar: D
Greg Martin

17

Octava, 20 bytes

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

Pruébalo en línea!

Explicación

Esto hace uso del hecho de que la secuencia de Fibonacci f(n)se puede escribir como (esto debería ser una notación de vector de matriz):

Recursivamente:

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

Explícitamente:

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

Esto significa que la entrada superior derecha de esta matriz a la potencia de nes el valor f(n)que estamos buscando. Obviamente, también podemos invertir esta matriz, ya que tiene rango completo, y la relación todavía describe la misma relación de recurrencia. Eso significa que también funciona para entradas negativas.


1
(Cómo) ¿Funciona esto también para una entrada negativa?
Roman Gräf

sí, viene la explicación ...
error

está ans(-6)destinado a ser positivo?
FlipTack

@FlipTack Lo sentimos, podría haber sido debido al cambio de índice. Usé 1, mientras que la pregunta usaba 0, lo arreglé ahora.
defecto


11

Python, 43 bytes

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

Una fórmula directa con la proporción áurea g. Con fla función anterior:

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

Misma longitud alt, solo alias la raíz cuadrada de 5:

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

No vi una manera de hacer una función recursiva que pudiera competir con estos. Un intento moderado de 57 bytes:

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

A modo de comparación, un método iterativo (60 bytes en Python 2):

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

O, para 58 bytes:

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

10

JavaScript (ES6), 42 bytes

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

Prueba


Realmente me gusta tu función. Tenía una sugerencia aquí, pero pasé por alto un -, así que no funcionaría ...
Luke

5

MATL , 11 9 bytes

Estoy contento con el [3,2], que seguramente se podría jugar al golf, si alguien conoce una forma, hágamelo saber =) (También funcionaría con [1,3]). Gracias @LuisMendo por -2 bytes =)

IHhBiY^2)

Esto está utilizando el mismo enfoque que la respuesta de Octave . Pero para generar la matriz

[1,1]
[1,0]

simplemente convertimos el número 3y 2de decimal a binario (es decir, 11y 10).

Pruébalo en línea!


5

JavaScript (ES7) 37 bytes

Utiliza la fórmula de Binet .

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

Esto genera el nth número de Fibonacci + - 0.0000000000000005.


**requiere ES7.
Neil

Oh, pensé que era parte de ES6, pero tienes razón. Lo cambié También usé otra versión de la fórmula de Binet para ahorrar 1B.
Lucas

Ahora que lo pienso, solo usar en 1-plugar de -1/pdebería haber funcionado para el mismo ahorro.
Neil

3

Jolf, 2 bytes

mL

Pruébalo aquí!

El fibonacci incorporado, implementado utilizando la phifórmula.


SyntaxError no capturado: token inesperado | en la nueva Función (<anónimo>) en p (math.min.js: 27) en Objeto (math.min.js: 27) en tipeado (eval en p (math.min.js: 27), <anónimo>: 36:14) en Object.n [como fábrica] (math.min.js: 45) en t (math.min.js: 27) en f (math.min.js: 27) en Object.get [como mediana ] (math.min.js: 27) en clone (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) en rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf. js: 2128 (Último Google Chrome, versión 55.0.2883.87m)
Ismael Miguel

@IsmaelMiguel Esto solo debería funcionar en firefox
Conor O'Brien

No tenía idea, no está en ninguna parte
Ismael Miguel

2

Haskell, 51 bytes

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

1
Pruebas múltiples dentro de un guardia se pueden combinar con ,en lugar de &&: even z,z<0.
nimi

1

Potencia Shell , 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)])}

Llamada de demostración:

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

Salida de demostración:

-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 bytes

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

Mi mirada a todos esos paréntesis .

Pruébalo en línea!

No muy pequeño en realidad. Actualmente hay un error de análisis que requiere uno para usar (get N)o en (+ N)lugar de simplemente N. Elegí el más pequeño. Sin embargo, no creo que se pueda hacer nada más para jugar golf.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.