Hay una pregunta muy conocido aquí que pregunta por un corto (menos caracteres) generador de secuencia de Fibonacci.
Me gustaría saber si alguien puede generar solo los primeros N elementos, de la secuencia de Fibonacci, en un espacio muy corto. Estoy tratando de hacerlo en Python, pero estoy interesado en cualquier respuesta corta, en cualquier idioma. La función F (N) genera los primeros N elementos de la secuencia, los devuelve como el retorno de la función o los imprime.
Curiosamente, parece que las respuestas de código de golf comienzan con 1 1 2
, en lugar de 0 1 1 2
. ¿Es una convención en código-golf o programación en general? (Wikipedia dice que la secuencia de Fibonacci comienza con cero).
Muestra de Python (primeros 5 elementos):
def f(i,j,n):
if n>0:
print i;
f(j,i+j,n-1)
f(1,1,5)
F_0 = 0, F_1 = 1
o de manera equivalenteF_1 = 1, F_2 = 1
. La diferencia es si desea comenzar la secuencia en el índice 0 (más común en programación) o 1 (más común en matemáticas).F_0 = 0, F_1 = 1
tiene un beneficio definitivo en simplicidad con la representación matricial[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Respuestas:
C
No me molesté en contar, pero aquí hay un ejemplo divertido:
Prueba de que funciona.
Estoy bastante orgulloso de esto: me aburrí, así que reorganicé mi código (con algunas pequeñas adiciones) para que cada línea representara un valor en la secuencia de Fibonacci.
Prueba de que funciona.
fuente
a++<=b
->a++-b
yreturn--n<3?1:f(n)+f(n-1)
. Además, puede evitarloscanf
si necesita que n esté adentroargc
.--n
en la misma expresión es irrelevante. ¡Brillante!4
que en realidad debería haber un3
. Como se escribe actualmente con el<4
, la secuencia producida es 1, 1, 1, 2, 3, 5, 8 ... Eso es demasiados 1's.return n<3?n>0:f(--n)+f(--n);
Haskell (26)
Sorprendentemente, este es solo un personaje más largo que la solución J.
Me afeito algunos caracteres al:
take
como operador binario;scanl
lugar del detalladozipWith
.fuente
s
es tan elegante que no sé cómo alguien pensaría en una solución como esa. Lo que no sabía es que puedes
volver a usarlo mientras defines
. (Todavía soy un principiante =)Aquí hay una Python de una sola línea. Utiliza punto flotante, por lo que puede haber algunos
n
para los que ya no es preciso.F(n)
devuelve una cadena que contiene los primerosn
números de Fibonacci separados por espacios.fuente
GolfScript, 16 caracteres
Salida de ejemplo:
fuente
Perl, 50 caracteres.
fuente
Scala 71:
huellas dactilares
fuente
Perl,
2928 bytesExplicación
Esto se basa en la
$b += $a = $b-$a
recurrencia clásica que funciona de la siguiente manera:$a
contieneF(n-2)
y$b
contieneF(n)
$a = $b-$a
$a
contieneF(n-1)
$b += $a
$b
contieneF(n+1)
El problema aquí es la inicialización. La forma clásica es
$b += $a = $b-$a || 1
pero luego la secuencia continúa1 2 3 5 ...
Al extender la secuencia de Fibonacci a la izquierda:
ves que el punto de partida adecuado es
$a = -1
y$b = 0
. La inicialización de $ a se puede combinar con la configuración del bucleFinalmente reemplace
$a
por$;
para deshacerse del espacio antes delfor
fuente
Te puedo dar una solución Python de dos líneas. Esto los devolverá como una lista.
Podría imprimirlos agregando otro mapa para hacerlos cadenas y luego agregando una unión, pero eso me parece innecesario.
Desafortunadamente no sé cómo poner una lambda recursiva
map
, así que estoy atrapado en dos líneas.fuente
g(100)
? ;)f(n)
conn<=0
devuelve enteros yn>0
devuelve listas, así que ... tal vez no sea lo ideal:f = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
0
en tu respuesta. Cambiarf
para volvern if n < 2
es una solución alternativa. :)Python (78 caracteres)
He utilizado la fórmula de Binet para calcular los números de Fibonacci -
No es tan pequeño algunas de las otras respuestas aquí, pero chico, es rápido
fuente
print"11235"
:)2**i
.**
tienen mayor prioridad que*
Esquema
Esto se optimiza utilizando la recursividad de cola:
fuente
Haskell
Prueba de que funciona .
fuente
J, 25 caracteres
Me doy cuenta de que las soluciones J probablemente no sean lo que buscas, pero aquí hay una de todos modos. :-)
Uso:
Cómo funciona:
Comenzando desde la derecha (porque los programas J se leen de derecha a izquierda),
2-~ 6
El~
operador invierte el argumento al verbo, por lo que esto es lo mismo que6-2
Ignorando la sección entre paréntesis por el momento,
0 1(...)@[&0~ x
toma el verbo entre paréntesis y lo ejecutax
veces usando la lista0 1
como entrada;~
nuevamente invierte los argumentos aquí, dandox (...)@[&0 ] 0 1
, lo que significa que puedo mantener la entrada al final de la función.Dentro de los corchetes hay un tenedor
],+/&(_2&{.)
que se compone de tres verbos]
,,
y+/&(_2&{.)
.Un tenedor toma tres verbos
a b c
y los usa así:(x a y) b (x c y)
dóndex
yy
son los argumentos del tenedor. El,
es el verbo central en esta bifurcación y une los resultados dex ] y
yx +/&(_2&{.) y
juntos.]
devuelve el argumento izquierdo sin modificaciones, por lo que sex ] y
evalúa comox
.+/&(_2&{.)
toma los dos últimos elementos de la lista dada(_2&{.)
, en este caso0 1
, y luego los agrega+/
(los&
s simplemente actúan como pegamento).Una vez que el verbo ha funcionado una vez que el resultado se retroalimenta para la siguiente ejecución, genera la secuencia.
fuente
TI-Basic, 43 caracteres
Este código puede insertarse directamente en el programa principal o convertirse en un programa separado al que hace referencia el primero.
fuente
APL (33)
Uso:
fuente
Pitón (55)
fuente
Powershell - 35 caracteres
Powershell acepta entradas de canalización , por lo que creo que
n |
inn | <mycode>
no debería estar en contra de mi cuenta, sino que es solo una parte de iniciar una "función" en el lenguaje.La primera solución supone que comenzamos en 0:
La segunda solución supone que podemos comenzar en 1:
Ejemplo de invocación:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Rendimientos:
Curiosamente, intentos de evitar la sobrecarga de la
for()
bucle resultaron en el mismo recuento de caracteres:%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.fuente
Python, 43 caracteres
Aquí hay tres frases básicas fundamentalmente diferentes que no usan la fórmula de Binet.
Nunca he abusado
reduce
tanto.fuente
reduce
abusodc, 32 caracteres:
En realidad, esto siempre mostrará los dos primeros 1, por lo que la función solo funciona como se esperaba para N> = 2 .
C, 75 caracteres:
No es tan genial como la respuesta aceptada, pero más corto y mucho más rápido:
Extra:CL, 64 caracteres:
Uno de mis marcadores más utilizados este semestre tiene un ejemplo interesante que es más corto que
muchosde los otros aquí, y es solo una invocación directa de laloop
macro, ¡básicamente solo una declaración! Despojado de todo el espacio en blanco que pude:¡Bastante corto, agradable y legible! Para leer la entrada,
n
(incluidos los espacios en blanco circundantes) puede reemplazarse(read)
, agregando 3 caracteres.fuente
main
toma cuatro argumentos?FALSO, 28 bytes
fuente
1_
lugar de0 1 -
Python 2, 38 bytes
Una mejora en una solución publicada anteriormente:
Esto usa
exec
una multiplicación de cuerdas para evitar bucles.Python 3, 46 bytes
No tan eficiente en Python 3:
fuente
C99, 58 caracteres
La siguiente función llena una matriz de enteros con los primeros
n
valores de la secuencia de Fibonacci que comienzan con 0.Pruebe el arnés, tomando
n
como argumento de línea de comando:fuente
CoffeeScript, 48
65 en js:
fuente
PHP, 87
Usos
array_sum
y función recursiva para generar series.P.ej:
fuente
F #, 123
fuente
Scala, 65 caracteres
Esto imprime, por ejemplo, los primeros 9 números de Fibonacci. Para una versión más útil que tome la longitud de secuencia de la entrada de la consola, se requieren 70 caracteres:
Tenga cuidado con el uso de un Rango que limita esto a los valores Int.
fuente
Q 24
Primeros n números de fibonacci
fuente
Lua, 85 bytes
Estoy aprendiendo Lua, así que me gustaría agregar este idioma al grupo.
y todo tomó 85 caracteres, con el parámetro como argumento de línea de comando. Otro buen punto es que es fácil de leer.
fuente
FALSO, 20 caracteres
La entrada debe estar en la pila antes de ejecutar esto.
fuente
Pyt , 3 bytes
Pruébalo en línea!
fuente
código de máquina x86 - 379 bytes
La versión con encabezados ELF con 484 bytes:
Versión sin encabezado (esa es la que se debe calificar):
fuente