Blog do TaQ

Sequência de Fibonacci com uma linha

Publicado em Developer

Lembrando de um famoso comercial de TV: "Tem coisas ... TUM! que só Ruby faz por você!". Olha só que coisa retardada que um sujeito fez para calcular uma sequência de Fibonacci em Ruby:

Fib = Hash.new{ |h, n| n < 2 ? h[n] = n : h[n] = h[n - 1] + h[n - 2] }
puts Fib[10]
=> 55

Dããããã! Coisa de doido. :-) O que acontece ali é o seguinte:

  1. É enviado um bloco para o método new da Hash, que indica que toda vez que for acessado um elemento da Hash e ele não existir, vai ser executado aquele código;
  2. Aí tentamos acessar o elemento com a chave 10 (que não existe);
  3. Nesse ponto é executado o bloco, verificando se o valor do elemento acessado é menor que 2, se for, ele atribui o elemento da Hash ao próprio valor (ou seja, 0=0, 1=1);
  4. Se não for menor que 2, é atribuído ao elemento o valor do elemento antes do corrente somado ao elemento antes desse também, ou seja, elemento_corrente-1 + elemento_corrente-2. Como os dois não existem, o bloco é executado para criar os dois, e por aí vai, até retornar o valor desejado;

Se quisermos verificar o que aconteceu, dá para fazer isso:

Fib.inspect
=> "{5=>5, 0=>0, 6=>8, 1=>1, 7=>13, 2=>1, 8=>21, 3=>2, 9=>34, 4=>3, 10=>55}"

Legal. :-)


Tags:


Comentários

Sem nenhum comentário.

comments powered by Disqus

Twitter