Función o secuencia de Fibonacci

115

La secuencia de Fibonacci es una secuencia de números, donde cada número de la secuencia es la suma de los dos números que la preceden. Los primeros dos números en la secuencia son ambos 1.

Aquí están los primeros términos

1 1 2 3 5 8 13 21 34 55 89 ...

Escriba el código más corto que:

  • Genera la secuencia de Fibonacci sin fin.

  • Dado ncalcula el ntérmino th de la secuencia. (1 o cero indexado)

Puede usar formas estándar de entrada y salida.

(Di ambas opciones en caso de que una sea más fácil de hacer en el idioma elegido que la otra).


Para la función que toma un n, debe admitirse un valor de retorno razonablemente grande (el número de Fibonacci más grande que se ajuste al tamaño de palabra normal de su computadora, como mínimo).


Tabla de clasificación

Chris Jester-Young
fuente

Respuestas:

48

Perl 6, 10 caracteres:

Lista de secuencias de fibonacci infinita anónima:

^2,*+*...*

Igual que:

0, 1, -> $x, $y { $x + $y } ... Inf;

Entonces, puede asignarlo a una matriz:

my @short-fibs = ^2, * + * ... *;

o

my @fibs = 0, 1, -> $x, $y { $x + $y } ... Inf;

Y obtenga los primeros once valores (de 0 a 10) con:

say @short-fibs[^11];

o con:

say @fibs[^11];

Espere, también puede obtener los primeros 50 números de la lista anónima:

say (^2,*+*...*)[^50]

Eso devuelve:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169
63245986 102334155 165580141 267914296 433494437 701408733 1134903170 
1836311903 2971215073 4807526976 7778742049

Y algunos puntos de referencia simples:

real    0m0.966s
user    0m0.842s
sys     0m0.080s

Con:

$ time perl6 -e 'say (^2, *+* ... *)[^50]'

EOF

Marco Aurélio da Silva
fuente
Ni siquiera pensaría ^2en reemplazarlo 0,1. +1
Konrad Borowski
2
Esto ya no es válido, tendrá que escribirlo como |^2,*+*...*, que es el mismo número de bytes que 0,1,*+*...*.
Brad Gilbert b2gills
55
Perl es muy raro.
Cyoce
1
¿En qué versión de Perl 6 se escribió esta respuesta?
CalculatorFeline
3
@CalculatorFeline Hubo un gran cambio conocido como GLR (Great List Refactor) que ocurrió poco antes del primer lanzamiento oficial que fue el 25/12/2015. Este código habría funcionado hasta ese momento.
Brad Gilbert b2gills
73

Brainfuck, 22 golpes

+>++[-<<[->+>+<<]>>>+]

Genera la secuencia de Fibonacci moviéndose gradualmente a través de la cinta de memoria.

R. Martinho Fernandes
fuente
55
¡Hermosa! Literalmente hermosa! O tal vez no ... de todos modos +1 para esto :)
Per Hornshøj-Schierbeck
2
Esto es 3.344 o 4 bytes en brainfuck comprimido. (6 ln (22)) / ln (256)
Will Sherwood
24
16 bytes:+[[<+>->+>+<<]>]
primo
3
14 bytes:+[.[>+>+<<-]>]
Charlim
2
@Stefnotch, por supuesto, el más corto es destructivo. La solución anterior termina con la secuencia de Fibonacci en la cinta, que es lo que también hace la solución de 16 bytes.
primo
51

Haskell, 17 15 14 caracteres

f=1:scanl(+)1f

Pruébalo en línea!

Luego.
fuente
44
¿Por qué no cortar dos espacios a f=0:scanl(+)1 f?
R. Martinho Fernandes
@ Martininho: Editado, gracias.
Anon
¡Guau, eso es incluso más corto de lo habitual f@(_:x)=0:1:zipWith(+)f x! Hay que recordarlo.
FUZxxl
44
Usted puede incluso despojar a otro espacio: f=0:scanl(+)1f.
FUZxxl
37

C # 4, 58 bytes

Stream (69; 65 si está tipeado débilmente IEnumerable)

(Asumiendo una usingdirectiva para System.Collections.Generic.)

IEnumerable<int>F(){int c=0,n=1;for(;;){yield return c;n+=c;c=n-c;}}

Valor único (58)

int F(uint n,int x=0,int y=1){return n<1?x:F(n-1,y,x+y);}
Jon Skeet
fuente
66
Dado que nes un uint, n==0se puede acortar a n<1. Y la transmisión puede ahorrar algunos caracteres al eliminar el espacio después del tipo genérico y declarar xen un alcance más amplio de lo necesario. De hecho, abandone por xcompleto:n+=c;c=n-c;
Peter Taylor
1
@ Peter: Gracias, editaré cuando tenga algo de tiempo.
Jon Skeet
Su versión de valor único es siempre que mi expresión recursiva lambda responda ... ¡bien!
Andrew Gray
1
@ wizzwizz4 si no me equivoco, si !nfunciona, entonces debería hacerlo si cambias nel condicional.
Cyoce
3
@JonSkeet Aw. Y aquí estaba pensando que había vencido a Jon Skeet en C # ... :-)
wizzwizz4
32

GolfScript, 12

¡Ahora, solo 12 caracteres!

1.{[email protected]+.}do
jtjacques
fuente
+1 buen trabajo. Si lo hace más corto que 13 caracteres, aceptaré instantáneamente su respuesta (a menos que alguien haga una respuesta aún más corta, por supuesto). :-P
Chris Jester-Young
1
Amo un reto ¡Hecho! ;-)
jtjacques
Bien, tú ganas. Al menos, hasta que alguien haga algo aún más corto (si eso es posible). :-P
Chris Jester-Young
55
¡esa definición es casi tan corta como el nombre 'Fibonacci' mismo! +1
agent-j
23

> <> - 15 caracteres

0:nao1v LF a+@:n:<o
Kevin Brown
fuente
Aunque puedes acortarlo 0:nao1v LF a+@:n:<osi quieres. Da 15 :) De hecho, esto también hace que la salida sea un poco más legible ...
tomsmeding
55
13 caracteres:01r:nao$:@+$r
randomra
21

J, 10 caracteres

Usar el cálculo incorporado de los coeficientes de la serie Taylor, por lo que quizás sea poco engañoso Lo aprendí aquí .

   (%-.-*:)t.

   (%-.-*:)t. 0 1 2 3 4 5 10 100
0 1 1 2 3 5 55 354224848179261915075
randomra
fuente
2
@aditsu (q:^-^:p) 6es 64 729donde p es par. J es probablemente bueno para lo que hace adivinanzas. :)
randomra
2
Aún mejor: (<:^-^:>) 4es 81y <:^-^:> 4es 53.5982.
randomra
2
El emoji que se muestra aquí es a lo que debe aspirar todo el código J. En una nota al margen, otra alternativa es +/@:!&i.-usar 9 bytes.
millas
1
@miles Muy bien! Debes publicarlo ya que es completamente diferente al mío.
randomra
21

Hexagony ,18 años 14 12

Gracias Martin por 6 bytes!

1="/}.!+/M8;

Expandido:

  1 = "
 / } . !
+ / M 8 ;
 . . . .
  . . .

Pruébalo en línea


Viejo, contesta. Esto se deja porque las imágenes y la explicación pueden ser útiles para los nuevos usuarios de Hexagony.

!).={!/"*10;$.[+{]

Expandido:

  ! ) .
 = { ! /
" * 1 0 ;
 $ . [ +
  { ] .

Esto imprime la secuencia de Fibonacci separada por nuevas líneas.

Pruébalo en línea! Sin embargo, tenga cuidado, al intérprete en línea no le gusta la salida infinita.

Explicación

Hay dos "subrutinas" para este programa, cada una de las cuales es ejecutada por una de las dos IP utilizadas. La primera rutina imprime nuevas líneas y la segunda realiza el cálculo y la salida de Fibonacci.

La primera subrutina comienza en la primera línea y se mueve de izquierda a derecha todo el tiempo. Primero imprime el valor en el puntero de memoria (inicializado a cero), y luego incrementa el valor en el puntero de memoria en 1. Después del no-op, el IP salta a la tercera línea que primero cambia a otra celda de memoria, luego imprime una nueva línea. Como una nueva línea tiene un valor positivo (su valor es 10), el código siempre saltará a la quinta línea, a continuación. La quinta línea devuelve el puntero de memoria a nuestro número de Fibonacci y luego cambia a la otra subrutina. Cuando regresemos de esta subrutina, la IP volverá a la tercera línea, después de ejecutar un no-op.

La segunda subrutina comienza en la esquina superior derecha y comienza a moverse hacia el sudeste. Después de un no-op, nos vemos obligados a viajar al oeste a lo largo de la segunda línea. Esta línea imprime el número actual de Fibonacci, antes de mover el puntero de memoria a la siguiente ubicación. Luego, el IP salta a la cuarta línea, donde calcula el siguiente número de Fibonacci usando los dos anteriores. Luego devuelve el control a la primera subrutina, pero cuando recupera el control del programa, continúa hasta que se encuentra con un salto, donde rebota sobre el espejo que originalmente se usó para apuntarlo al Oeste, ya que regresa a la segunda línea.


Imágenes bonitas preliminares!

El lado izquierdo de la imagen es el programa, el lado derecho representa la memoria. El cuadro azul es la primera IP, y ambas IP apuntan a la siguiente instrucción que se ejecutará.

ingrese la descripción de la imagen aquí

Nota: Las imágenes solo pueden parecer bonitas para las personas que tienen una habilidad similar limitada con los programas de edición de imágenes: PI agregará al menos 2 iteraciones más para que el uso del *operador sea más claro.

Nota 2: solo vi la respuesta de alephalpha después de escribir la mayor parte de esto, pensé que todavía era valioso debido a la separación, pero las partes reales de Fibonacci de nuestros programas son muy similares. Además, este es el programa de Hexagony más pequeño que he visto haciendo uso de más de una IP, así que pensé que sería bueno mantenerlo de todos modos: P

FryAmTheEggman
fuente
Debe vincular a lo que solía hacer para hacer las fotos bonitas, luego poner el enlace en esolangs.org/wiki/Hexagony .
mbomb007
1
@ mbomb007 Usé gimp para crear manualmente cada cuadro, luego cargué las imágenes en un sitio web de creación de gifs. Aunque, varias veces durante este proceso, consideré hacer una herramienta para hacerlo, considerando lo tedioso que era.
FryAmTheEggman
@FryAmTheEggman ¡Impresionante! Hazlo un desafío. Estoy seguro de que alguien publicará una respuesta. : D Aún mejor si pudiera crear un sitio web similar al intérprete en línea de fish.
mbomb007
@ mbomb007 Eso podría ser un poco ambicioso para un desafío en este sitio, sin mencionar que probablemente sufriría mucho por ser realmente amplio. No creo que publique eso, pero siéntase libre de hacerlo usted mismo si cree que tiene una buena manera de presentarlo. Además, creo que Timwi creó un C # ide para la hexagonía, aunque nunca lo he usado porque no me he molestado con mono.
FryAmTheEggman
1
@ mbomb007 El ide vive aquí , por cierto, olvidé vincularlo la última vez.
FryAmTheEggman
18

VACA , 108

 MoO moO MoO mOo MOO OOM MMM moO moO
 MMM mOo mOo moO MMM mOo MMM moO moO
 MOO MOo mOo MoO moO moo mOo mOo moo
Timtech
fuente
17

Python 2, 34 bytes

Python, usando la recursividad ... ¡aquí viene un StackOverflow!

def f(i,j):print i;f(j,i+j)
f(1,1)
jtjacques
fuente
15

Jalea , 3 bytes

+¡1

Pruébalo en línea!

Cómo funciona

+¡1    Niladic link. No implicit input.
       Since the link doesn't start with a nilad, the argument 0 is used.

  1    Yield 1.
+      Add the left and right argument.
 ¡     For reasons‡, read a number n from STDIN.
       Repeatedly call the dyadic link +, updating the right argument with
       the value of the left one, and the left one with the return value.

¡ mira los dos enlaces a la izquierda. Como solo hay uno, tiene que ser el cuerpo del bucle. Por lo tanto, se lee un número desde la entrada. Como no hay argumentos de línea de comandos, ese número se lee desde STDIN.

Dennis
fuente
12

Golfscript - número único - 12/12/10

12 caracteres para tomar la entrada de stdin:

~0 1@{.@+}*;

11 caracteres para la entrada ya en la pila:

0 1@{.@+}*;

10 caracteres para definir 1 como el número 0 de Fibonacci:

1.@{.@+}*;
aaaaaaaaaaaa
fuente
1
La opción es "Calcula, dado n, el enésimo número de Fibonacci". Así que deshazte del ~y tienes 11 caracteres que toman nla pila y la dejan F_nen la pila.
Peter Taylor
12

Rubí

29 27 25 24 caracteres

p a=b=1;loop{b=a+a=p(b)}

Editar: lo convirtió en un bucle infinito. ;)

st0le
fuente
13
¿Alguien notó que b=a+a=bes un palíndromo? :)
st0le
2
sí st0le did :)
gnibbler 01 de
Sé que llego tarde a la fiesta, pero ¿alguien puede explicar cómo funciona la b=a+a=bparte? Parece que no puedo entenderlo.
Sr. Llama
3
@GigaWatt, piénsalo de esta manera, las instrucciones se ejecutan de izquierda a derecha ... así quenewb=olda+(a=oldb)
sigue
puedes guardar 2 caracteres usando loop:p 1,a=b=1;loop{p b=a+a=b}
Patrick Oscity
11

Mathematica, 9 caracteres

Fibonacci

Si las funciones integradas no están permitidas, aquí hay una solución explícita:

Mathematica, 33 32 31 caracteres

#&@@Nest[{+##,#}&@@#&,{0,1},#]&
celtschk
fuente
#&@@Nest[{#+#2,#}&@@#&,{0,1},#]&32 caracteres
Chyanog
1
@chyanog 31:#&@@Nest[{+##,#}&@@#&,{0,1},#]&
Mr.Wizard
1
@ Mr.Wizard 24 caracteres (26 bytes):Round[GoldenRatio^#/√5]&
JungHwan Min
1
o 23 caracteres (27 bytes):Round[((1+√5)/2)^#/√5]&
JungHwan Min
10

DC (20 bytes)

Como beneficio adicional, incluso está ofuscado;)

zzr[dsb+lbrplax]dsax

EDITAR: Puedo señalar que imprime todos los números en la secuencia de Fibonacci, si espera lo suficiente.

Hiato
fuente
13
No lo llamaría ofuscado: se supone que el código ofuscado es difícil de entender, y en lo que respecta a CC, el código aquí es completamente sencillo.
Nabb
10

Preludio , 12 bytes

Uno de los pocos desafíos donde Prelude es realmente bastante competitivo:

1(v!v)
  ^+^

Esto requiere el intérprete de Python que imprime los valores como números decimales en lugar de caracteres.

Explicación

En Prelude, todas las líneas se ejecutan en paralelo, con el puntero de instrucción atravesando las columnas del programa. Cada línea tiene su propia pila que se inicializa a cero.

1(v!v)
  ^+^
| Push a 1 onto the first stack.
 | Start a loop from here to the closing ).
  | Copy the top value from the first stack to the second and vice-versa.
   | Print the value on the first stack, add the top two numbers on the second stack.
    | Copy the top value from the first stack to the second and vice-versa.

El bucle se repite para siempre, porque la primera pila nunca tendrá un 0top.

Tenga en cuenta que esto inicia la secuencia de Fibonacci desde 0.

Martin Ender
fuente
10

Hexagonía , 6 bytes.

No competir porque el lenguaje es más nuevo que la pregunta.

1.}=+!

Sin golf:

  1 .
 } = +
  ! .

Imprime la secuencia de Fibonacci sin ningún separador.

alephalpha
fuente
2
Esto tiene el pequeño problema de que no imprime ningún separador entre los números. Sin embargo, esto no está del todo bien especificado en el desafío. (Y estoy muy feliz de que alguien esté usando Hexagony. :))
Martin Ender
9

TI-BASIC, 11

Por el legendario golfista TI-BASIC Kenneth Hammond ("Weregoose"), desde este sitio . Se ejecuta en el tiempo O (1) y considera que 0 es el término 0 de la secuencia de Fibonacci.

int(round(√(.8)cosh(Anssinh‾¹(.5

Usar:

2:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     1

12:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     144

¿Como funciona esto? Si haces los cálculos, resulta que sinh‾¹(.5)es igual a ln φ, por lo que es una versión modificada de la fórmula de Binet que se redondea en lugar de usar el (1/φ)^ntérmino de corrección. El round((redondear a 9 decimales) es necesario para evitar errores de redondeo.

Thomas Kwa
fuente
8

K - 12

Calcula el número de Fibonacci ny n-1.

{x(|+\)/0 1}

Solo el nthnúmero de Fibonacci.

{*x(|+\)/0 1}
isawdrones
fuente
+1 ¡No está mal! Si pudieras reducirlo a un solo carácter (y proporcionarme una forma de probarlo), aceptaré tu respuesta. :-)
Chris Jester-Young
La única forma de reducirlo sería reemplazar la función con una llamada a un número conocido: n (| + \) / 0 1 Pruébelo con este intérprete .
isawdrones
7

Julia, 18 bytes

n->([1 1;1 0]^n)[]
Rɪᴋᴇʀ
fuente
7

Java, 55

No puedo competir con la concisión de la mayoría de los idiomas aquí, pero puedo ofrecer una forma sustancialmente diferente y posiblemente mucho más rápida (tiempo constante) para calcular el enésimo número:

Math.floor(Math.pow((Math.sqrt(5)+1)/2,n)/Math.sqrt(5))

nes la entrada (int o long), comenzando con n = 1. Utiliza la fórmula y las rondas de Binet en lugar de la resta.

Hans-Peter Störr
fuente
Me encanta esta solución
Andreas
Esto no parece funcionar para mí, ¡pero es temprano y es posible que me falte algo! Asumiendo 0que es el primer número de la secuencia, esto da 0, 0, 1, 1, 3, 4, 8, 12, 21, 33para los primeros 10 números
Shaggy
@Shaggy ¡Vaya! Lo siento, introduje un error, solucionado ahora.
Hans-Peter Störr
6

Ruby, 25 caracteres

La respuesta de st0le se acortó.

p 1,a=b=1;loop{p b=a+a=b}
Matma Rex
fuente
66
En realidad, puede acortarlo aún más usandoa=b=1;loop{p a;b=a+a=b}
Ventero
66
¿Entonces le robaste su respuesta? : P
mbomb007
6

FAC: APL funcional, 4 caracteres (!!)

No es mío, por lo tanto publicado como wiki de la comunidad. FAC es un dialecto de APL que Hai-Chen Tu aparentemente sugirió como su disertación de doctorado en 1985. Más tarde escribió un artículo junto con Alan J. Perlis llamado " FAC: un lenguaje APL funcional ". Este dialecto de APL utiliza "matrices diferidas" y permite matrices de longitud infinita. Define un operador "iter" ( ) para permitir la definición compacta de algunas secuencias recursivas.

El caso monádico ("unario") es básicamente el de Haskell iteratey se define como (F⌼) A ≡ A, (F A), (F (F A)), …. El caso ( "binario") diádica se define un tanto análoga por dos variables: A (F⌼) B ≡ A, B, (A F B), (B F (A F B)), …. ¿Por qué es útil esto? Bueno, resulta que este es precisamente el tipo de recurrencia que tiene la secuencia de Fibonacci. De hecho, uno de los ejemplos dados es

1+⌼1

produciendo la secuencia familiar 1 1 2 3 5 8 ….

Entonces, allí está, posiblemente la implementación de Fibonacci más corta posible en un lenguaje de programación no novedoso. :RE

Luciérnaga
fuente
Oh, accidentalmente eliminé de wikis tu comunidad como parte de mi (manual) desentrañamiento masivo. Oh bien. ;-)
Chris Jester-Young
6

R, 40 bytes

No he visto una solución R, así que:

f=function(n)ifelse(n<3,1,f(n-1)+f(n-2))
plannapus
fuente
1
Sé que esta es una respuesta antigua, pero puede acortar a 38 bytes
Robert S.
6

05AB1E, 7 bytes

Código:

1$<FDr+

Pruébalo en línea!

Vimlesh
fuente
3
Hola y bienvenidos a PPCG! Bonito primer post!
Rɪᴋᴇʀ
6

Dodos , 26 bytes

	dot F
F
	F dip
	F dip dip

Pruébalo en línea!

Cómo funciona

La función F hace todo el trabajo pesado; se define recursivamente de la siguiente manera.

F(n) = ( F(|n - 1|), F(||n - 1| - 1|) )

Siempre que n> 1 , tenemos | n - 1 | = N - 1 <n y || n - 1 | - 1 | = | n - 1 - 1 | = n - 2 <n , entonces la función retorna (F (n - 1), F (n - 2)) .

Si n = 0 , entonces | n - 1 | = 1> 0 ; si n = 1 , entonces || n - 1 | - 1 | = | 0 - 1 | = 1 = 1 . En ambos casos, los intentos de llamadas recursivas F (1) generan una excepción de Rendición , por lo que F (0) devuelve 0 y F (1) devuelve 1 .

Por ejemplo, F (3) = (F (1), F (2)) = (1, F (0), F (1)) = (1, 0, 1) .

Finalmente, la función principal se define como

main(n) = sum(F(n))

por lo que se suma todas las coordenadas del vector devuelto por F .

Por ejemplo, main (3) = sum (F (3)) = sum (1, 0, 1) = 2 .

Dennis
fuente
5

Desmos , 61 bytes

Golfed

Haz clic en el add sliderbotón para n.

p=.5+.5\sqrt{5}
n=0
f=5^{-.5}\left(p^n-\left(-p\right)^{-n}\right)

La última línea es la salida.

Sin golf

Es una función.

\phi =\frac{1+\sqrt{5}}{2}
f_{ibonacci}\left(n\right)=\frac{\phi ^n-\left(-\phi \right)^{-n}}{\sqrt{5}}
Conor O'Brien
fuente
5

Cubix , 10 bytes

Respuesta no competitiva porque el lenguaje es más nuevo que la pregunta.

Cubix es un nuevo lenguaje bidimensional de @ETHproductions donde el código está envuelto en un cubo del tamaño adecuado.

;.o.ON/+!)

Pruébalo en línea

Esto se envuelve en un cubo de 2 x 2 de la siguiente manera

    ; .
    o .
O N / + ! ) . .
. . . . . . . .
    . .
    . .
  • O dar salida al valor de los TOS
  • N empujar nueva línea en la pila
  • / reflexionar hacia el norte
  • o dar salida al carácter de los TOS
  • ; pop TOS
  • / reflexionar hacia el este después de dar la vuelta al cubo
  • + agregar los 2 valores principales de la pila
  • ! omita el siguiente comando si TOS es 0
  • ) incremente el TOS en 1. Esto inicia la secuencia esencialmente.

Este es un bucle sin fin que imprime la secuencia con un separador de nueva línea. Aprovecha el hecho de que la mayoría de los comandos no muestran los valores de la pila.
Si se ignora el separador, esto se puede hacer con 5 bytes.O+!)

MickyT
fuente
5

Brainfuck, 16,15, 14/13 caracteres

+[[->+>+<<]>]  

Genera la secuencia de Fibonacci y no imprime nada. Además, es más corto que el de arriba.

+[.[->+>+<<]>]   

Este tiene 14 caracteres pero imprime caracteres ASCII con los valores de la secuencia de Fibonacci.

Stefnotch
fuente
1
Esto es bueno, pero ¿sería incorrecto decir que la versión de 14 bytes solo sale del 2do 1 en adelante? ¿Como en "1 2 3 5 8" en lugar de "1 1 2 3 5 8"?
Charlim
1
@Charlim Oh, tienes razón. No tengo idea de lo que pensé el 2014. De todos modos, lo arreglé moviendo las instrucciones de impresión al frente del bucle.
Stefnotch