Definición
La secuencia de Fibonacci de potencia alterna se forma de la siguiente manera.
Comience con la secuencia vacía y establezca n en 1 .
Compute f n , el n º no negativo número de Fibonacci , con repeticiones.
0 es el primero, 1 es el segundo y el tercero, 2 es el cuarto. Todos los demás se obtienen sumando los dos números anteriores en la secuencia, por lo que 3 = 1 + 2 es el quinto, 5 = 2 + 3 es el sexto, etc.Si n es impar, cambie el signo de f n .
Agregue 2 copias n-1 de f n a la secuencia.
Incremente ny regrese al paso 2.
Estos son los primeros cien términos de la secuencia APF.
0 1 1 -1 -1 -1 -1 2 2 2 2 2 2 2 2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
Tarea
Escribir un programa completo o una función que toma un número entero positivo n como entrada y grabados o devuelve el n º término de la secuencia de APF.
Si prefiere la indexación basada en 0, también puede tomar un número entero no negativo n e imprimir o devolver el número APF en el índice n .
Este es el código de golf ; ¡que gane el código más corto en bytes!
Casos de prueba (basados en 1)
1 -> 0
2 -> 1
3 -> 1
4 -> -1
7 -> -1
8 -> 2
100 -> -8
250 -> 13
500 -> -21
1000 -> 34
11111 -> 233
22222 -> -377
33333 -> 610
Casos de prueba (basados en 0)
0 -> 0
1 -> 1
2 -> 1
3 -> -1
6 -> -1
7 -> 2
99 -> -8
249 -> 13
499 -> -21
999 -> 34
11110 -> 233
22221 -> -377
33332 -> 610
Respuestas:
Jalea , 5 bytes
Pruébalo en línea!
¿Cómo?
Extender la serie de Fibonacci nuevamente a índices negativos de tal manera que la relación
f(i) = f(i-2) + f(i-1)
aún se mantenga:Volviendo a
i=0
los números, son los que necesitamos repetir 2 n-1 veces, y Jelly's Fibonacci incorporado losÆḞ
calculará.Podemos encontrar el
-i
(un número positivo) que necesitamos tomando la longitud de bitsn
y restando1
.Dado que queremos
i
(un número negativo) que en su lugar puede realizar1-bitLength
y la jalea tiene un átomo de1-x
,C
, la mónada complemento.fuente
µ
y⁸
Python 2 , 30 bytes
Pruébalo en línea!
Un índice.
La secuencia se sintió como un rompecabezas, algo que Dennis generó al tener una forma corta de expresarlo. Las repeticiones de la potencia de dos sugieren recurrencia mediante desplazamiento de bits (división del piso por 2). La recursión de Fibonacci de signos alternos
f(n)=f(n-2)-f(n-1)
se puede adaptar al desplazamiento de bits en lugar de disminuir. El caso base funciona bien porque todo se canaliza hacian=0
.fuente
Mathematica,
433624 bytes7 bytes guardados gracias a @GregMartin, y otros 12 gracias a @JungHwanMin.
fuente
Floor@Log2@#
y escribiendoFibonacci[t=...]
(y eliminando los espacios en el último exponente).Fibonacci@-Floor@Log2@#&
- tambiénFibonacci
puede tomar argumentos negativos (se encarga del signo por usted).MATL ,
19171611 bytesLa entrada está basada en 1.
Pruébalo en línea! O verificar todos los casos de prueba .
Cómo funciona
Para la entrada n basada en 1 , sea m el número de dígitos en la expansión binaria de n . El n término-ésimo en la secuencia de salida es la m término-ésimo en la secuencia de Fibonacci, posiblemente con su signo cambiado.
Una idea sería iterar m veces para calcular los términos de la secuencia de Fibonacci. Esto es fácil con un
for each
bucle que usa la matriz de dígitos binarios. Si la secuencia de Fibonacci se iniciara con 0 , entonces 1 como de costumbre, iterar m veces daría como resultado m + 2 términos en la pila, por lo que los dos números superiores tendrían que eliminarse. En cambio, iniciamos con 1 , luego 0 . De esa forma, los siguientes términos generados son 1 , 1 , 2 , ... y solo se necesita una eliminación.El signo podría tratarse utilizando otro ciclo para cambiar el signo m veces. Pero eso es costoso. Es mejor integrar los dos bucles, lo que se hace simplemente restando en lugar de sumar la iteración de Fibonacci.
fuente
JavaScript (ES6), 33 bytes
1 indexado.
La respuesta de un puerto de xnor sería 23:
fuente
Python 2 ,
838279 bytesPruébalo en línea!
fuente
or -1
.Jalea , 9 bytes
Utiliza indexación basada en uno.
Pruébalo en línea!
Explicación
Este método funciona si su función Fibonacci solo admite argumentos no negativos.
fuente
Japt , 6 bytes
¡Pruébalo en línea!
Cómo funciona
Como se ha mencionado en otras respuestas, la n º término en la serie de Fibonacci alterna signo es la misma que la -n ésimo término de la serie regular. n se puede encontrar tomando la longitud de bits de la entrada y restando uno; negar esto da como resultado 1 menos la longitud de bits.
fuente
05AB1E ,
1110 bytesUtiliza indexación basada en 1
La función de Fibonacci de 05AB1E devuelve números positivos de fib menos de n , lo que significa que tendríamos que generar más de lo necesario, obtener el correcto por índice y luego calcular el signo. Así que dudo que cualquier método basado en eso sea más corto que calcular los números de forma iterativa.
Se da cuenta de que podemos inicializar la pila con
1, 0
invertida para manejar el caso cuando sen=1
describe en la respuesta MATL de Luis Mendo .Pruébalo en línea!
Explicación
fuente
Perl 6 , 53 bytes
Implementación directa de la secuencia, la forma en que se describió.
De base cero.
fuente
Julia 0.5 , 19 bytes
Pruébalo en línea!
Cómo funciona
Esto usa la misma fórmula que la respuesta Python de @ xnor . La relación de recurrencia
g (n) = g (n-2) + g (n-1) genera los términos negativos de la secuencia de Fibonacci, que son iguales a los términos positivos con signos alternos. Desde cualquier parte de una ejecución de 2 k repeticiones del mismo número, podemos elegir cualquier repetición de la ejecución anterior de 2 k-1 números y la ejecución de 2 k-2 números anteriores dividiendo el índice entre 2 y 4 .
En lugar de lo sencillo
Podemos redefinir un operador para nuestros propósitos. Además, f funcionará igual de bien con flotadores, así que obtenemos
Finalmente, si actualizamos n con una división por 4 , podemos escribir n / 2 como 2n y omitir un par de parens, lo que lleva a la definición de la función de 19 bytes en esta respuesta.
fuente
J , 18 bytes
Utiliza indexación basada en uno. Toma un entero de entrada n > 0 y calcula
floor(log2(n))
al encontrar la longitud de su representación binaria y luego disminuye ese valor en uno. Luego encuentra el coeficientefloor(log2(n))-1
th de la función generadora x / (1 + x - x 2 ), que es el gf para los valores de Fibonacci indexados negativamente.Pruébalo en línea!
Explicación
fuente