Calculando números primos no Scala: como funciona esse código?
Então, passei horas tentando descobrir exatamente como esse código produz números primos.
lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
ps.takeWhile{j => j * j <= i}.forall{ k => i % k > 0});
Eu usei um número de printlns etc, mas nada tornando mais claro.
Isso é o que eu acho que o código faz:
/**
* [2,3]
*
* takeWhile 2*2 <= 3
* takeWhile 2*2 <= 4 found match
* (4 % [2,3] > 1) return false.
* takeWhile 2*2 <= 5 found match
* (5 % [2,3] > 1) return true
* Add 5 to the list
* takeWhile 2*2 <= 6 found match
* (6 % [2,3,5] > 1) return false
* takeWhile 2*2 <= 7
* (7 % [2,3,5] > 1) return true
* Add 7 to the list
*/
Mas se eu mudarj*j
na lista para ser 2 * 2 que euassumido funcionaria exatamente da mesma forma, causaria um erro de stackoverflow.
Eu obviamente sinto falta de algo fundamental aqui, e poderia realmente usar alguém explicando isso para mim como se eu tivesse cinco anos de idade.
Qualquer ajuda seria muito apreciada.