Nos últimos meses, tenho dedicado algum tempo para aprender Scala. Então, decidi que é chegada a hora de ajudar a divulgar esta excelente linguagem. Nada como um problema clássico para começar: calcular números primos utilizando o Crivo de Eratóstenes. Vale lembrar que o foco deste post não é mostrar como calcular números primos usando o Crivo de Eratóstenes, mas como fazê-lo em Scala. A imagem abaixo mostra como funciona o Crivo, mais informações sobre podem ser obtidas aqui.

Crivo de Eratóstenes

Crivo de Eratóstenes. Fonte: Wikipedia

Sem meias palavras, a solução COMPLETA é listada em seguida:

def primos = crivo(Stream from 2)
def crivo(s: Stream[Int]): Stream[Int] = Stream.cons(s.head, crivo(s.tail filter { _ % s.head != 0 }))

Explicando…

O código acima define duas funções: primos e crivo. A primeira, primo, retorna uma lista de todos os números primos a partir de 2 – mas não se preocupe, os números apenas serão calculados à medida que forem necessários, isto é possivel utilizando-se Streams. A segunda, crivo, executa a lógica do crivo. Utilizando Streams ela seleciona o primeiro elemento(que é primo) da lista de números passada como argumento e elimina/filtra todos os múltiplos do número selecionado da cauda da lista. Pelo que vc já deve ter percebido, Streams consistem de um elemento inicial, a cabeça da lista(head), e uma lista representando os demais elementos, a cauda(tail).

Playground!

Agora que temos uma lista de números primos, vamos usá-la para:

Calcular e imprimir os N primeiros números primos

primos take 10 foreach println

Calcular e imprimir todos os números primos menores que 120 (como aparece na imagem acima)

primos takeWhile {_ < 120} foreach println

Calcular e imprimir o 100° número primo

print(primos(100))

Calcular e imprimir do 100° ao 110° número primo

primos.slice(100,110)foreach println

Há várias outras possibilidades. Veja documentação da classe Stream e divirta-se!

Até a próxima!