Há uma pergunta bem conhecida aqui que pede um gerador de sequência de fibonacci curto (menos caracteres).
Gostaria de saber se alguém pode gerar apenas os primeiros N elementos, da sequência de fibonacci, em um espaço muito curto. Estou tentando fazer isso em python, mas estou interessado em qualquer resposta curta, em qualquer idioma. A função F (N) gera os primeiros N elementos da sequência, os retorna como o retorno da função ou os imprime.
Curiosamente, parece que as respostas do código-golfe começam com 1 1 2
, em vez de 0 1 1 2
. Isso é uma convenção em código-golfe ou programação em geral? (A Wikipedia diz que a sequência de fibonacci começa com zero.).
Exemplo de Python (5 primeiros 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
ou equivalentementeF_1 = 1, F_2 = 1
. A diferença é se você deseja iniciar a sequência no índice 0 (mais comum em programação) ou 1 (mais comum em matemática).F_0 = 0, F_1 = 1
tem um benefício definido na simplicidade com a representação da matriz[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Respostas:
C
Não se incomodou em contar, mas aqui está um exemplo divertido:
Prova de que funciona.
Estou bastante orgulhoso disso: fiquei entediado, então reorganizei meu código (com algumas pequenas adições) para torná-lo onde cada linha representa um valor na sequência de Fibonacci.
Prova de que funciona.
fonte
a++<=b
->a++-b
ereturn--n<3?1:f(n)+f(n-1)
. Além disso, você pode evitarscanf
se precisar que n estejaargc
.--n
mesma expressão é irrelevante. Brilhante!4
deveria realmente ter um3
. Como está escrito atualmente com o<4
, a sequência produzida é 1, 1, 1, 2, 3, 5, 8 ... Esse é um número 1 demais.return n<3?n>0:f(--n)+f(--n);
Haskell (26)
Surpreendentemente, esse é apenas um caractere mais longo que a solução J.
Eu raspo alguns caracteres por:
take
como um operador binário;scanl
vez do detalhadozipWith
.fonte
s
é tão elegante que não sei como alguém pensaria em uma solução como essa! O que eu não sabia é que você pode usars
novamente enquanto defines
. (Ainda sou iniciante =) #Aqui está um Python de uma linha. Ele usa ponto flutuante; portanto, pode haver alguns
n
dos quais não é mais preciso.F(n)
retorna uma string contendo os primeirosn
números de Fibonacci separados por espaços.fonte
GolfScript, 16 caracteres
Exemplo de saída:
fonte
Perl, 50 caracteres
fonte
Scala 71:
impressões
fonte
Perl,
2928 bytesExplicação
Isso se baseia na
$b += $a = $b-$a
recorrência clássica, que funciona da seguinte maneira:$a
contémF(n-2)
e$b
contémF(n)
$a = $b-$a
$a
contémF(n-1)
$b += $a
$b
contémF(n+1)
O problema aqui é a inicialização. O jeito clássico é,
$b += $a = $b-$a || 1
mas então a sequência continua1 2 3 5 ...
Estendendo a sequência de fibonacci para a esquerda:
você vê que o ponto de partida apropriado é
$a = -1
e$b = 0
. A inicialização de $ a pode ser combinada com a configuração do loopPor fim, substitua
$a
por$;
para se livrar do espaço antes dafor
fonte
Posso fornecer uma solução Python de duas linhas. Isso os retornará como uma lista.
Você pode imprimi-los adicionando outro mapa para torná-los strings e adicionando uma junção, mas isso me parece desnecessário.
Infelizmente eu não sei como colocar um lambda recursivo
map
, então estou preso em duas linhas.fonte
g(100)
? ;)f(n)
comn<=0
retornos inteiros en>0
listas de devoluções, então .. talvez não seja o 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
em sua resposta. Alterarf
para retornarn if n < 2
é uma solução alternativa. :)Python (78 caracteres)
Eu usei a fórmula de Binet para calcular os números de fibonacci -
Não é tão pequeno, algumas das outras respostas aqui, mas garoto, é rápido
fonte
print"11235"
:)2**i
.**
tem precedência maior do que*
Esquema
Isso é otimizado usando a recursão da cauda:
fonte
Haskell
Prova de que funciona .
fonte
J, 25 caracteres
Sei que as soluções J provavelmente não são o que você procura, mas aqui está uma de qualquer maneira. :-)
Uso:
Como funciona:
Começando pela direita (porque os programas J são lidos da direita para a esquerda),
2-~ 6
O~
operador reverte o argumento para o verbo, portanto é o mesmo que6-2
Ignorar a seção entre parênteses por enquanto,
0 1(...)@[&0~ x
pega o verbo entre parênteses e executa váriasx
vezes usando a lista0 1
como entrada -~
novamente inverte os argumentos aqui, fornecendox (...)@[&0 ] 0 1
, o que significa que posso manter a entrada no final da função.Dentro dos suportes existe um garfo
],+/&(_2&{.)
composto por três verbos -]
,,
e+/&(_2&{.)
.Um garfo pega três verbos
a b c
e os usa assim:(x a y) b (x c y)
ondex
ey
são os argumentos do garfo. O,
é o verbo central nesta bifurcação e junta os resultados dex ] y
ex +/&(_2&{.) y
juntos.]
retorna o argumento esquerdo inalterado parax ] y
avaliar comox
.+/&(_2&{.)
leva os dois últimos itens da lista dada(_2&{.)
- neste caso0 1
- e, em seguida, adiciona-los juntos+/
(o&
s apenas agir como cola).Uma vez que o verbo tenha operado uma vez que o resultado é realimentado para a próxima execução, gerando a sequência.
fonte
TI-Basic, 43 caracteres
Esse código pode ser inserido diretamente no programa principal ou transformado em um programa separado que é referenciado pelo primeiro.
fonte
APL (33)
Uso:
fonte
Python (55)
fonte
Powershell - 35 caracteres
Powershell aceita tubulação de entrada , então eu sou da crença de que o
n |
emn | <mycode>
não deve ser contra a minha contagem, mas é apenas uma parte de iniciar uma "função" na língua.A primeira solução assume que começamos com 0:
A segunda solução assume que podemos começar em 1:
Exemplo de invocação:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Rendimentos:
Curiosamente, tentativas de evitar a sobrecarga do
for()
circuito resultou na mesma contagem de caracteres:%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.fonte
Python, 43 caracteres
Aqui estão três linhas básicas fundamentalmente diferentes que não usam a fórmula de Binet.
Eu nunca abusei
reduce
tanto.fonte
reduce
abusodc, 32 caracteres:
Na verdade, isso sempre mostra os dois primeiros 1s, portanto, a função funciona apenas conforme o esperado para N> = 2 .
C, 75 caracteres:
Não é tão legal quanto a resposta aceita, mas mais curto e muito mais rápido:
Extra:CL, 64 caracteres:
Um dos meus favoritos mais usados neste semestre tem um exemplo interessante que é mais curto do que
muitosoutros aqui, e é apenas uma invocação direta daloop
macro - basicamente apenas uma declaração! Despojei-o para todo o espaço em branco que pude:Muito curto, agradável e legível! Para ler a entrada,
n
(incluindo os espaços em branco ao redor), pode ser substituído por(read)
, adicionando 3 caracteres.fonte
main
leva quatro argumentos?FALSO, 28 bytes
fonte
1_
vez de0 1 -
Python 2, 38 bytes
Uma melhoria em uma solução postada anteriormente:
Isso usa uma
exec
multiplicação de strings para evitar loops.Python 3, 46 bytes
Não é tão eficiente no Python 3:
fonte
C99, 58 caracteres
A função a seguir preenche uma matriz de números inteiros com os primeiros
n
valores da sequência de Fibonacci começando com 0.Arnês de teste, tomando
n
como argumento da linha de comando:fonte
CoffeeScript, 48
65 em js:
fonte
PHP, 87
Usos
array_sum
e função recursiva para gerar séries.Por exemplo:
fonte
F #, 123
fonte
Scala, 65 caracteres
Isso imprime, por exemplo, os 9 primeiros números de Fibonacci. Para uma versão mais utilizável, utilizando o comprimento da sequência da entrada do console, são necessários 70 caracteres:
Cuidado com o uso de um intervalo que limita isso aos valores Int.
fonte
Q 24
Primeiros n números de fibonacci
fonte
Lua, 85 bytes
Estou aprendendo Lua, então gostaria de adicionar esse idioma ao pool.
e a coisa toda teve 85 caracteres, com o parâmetro como argumento da linha de comando. Outro ponto positivo é que é fácil de ler.
fonte
FALSO, 20 caracteres
A entrada deve estar na pilha antes de executar isso.
fonte
Pyt , 3 bytes
Experimente online!
fonte
código de máquina x86 - 379 bytes
A versão com cabeçalhos ELF com 484 bytes:
Versão sem cabeçalho (que é a única a ser classificada):
Calcula (possivelmente)∞ números de fibonacci.
fonte