소수 계산

val primeStream:Stream[Int] = 2 #:: Stream.from(3, 2).filter(i => primeStream.takeWhile(j => j*j <= i).forall(k => i%k != 0))

stackoverflow에 올라와 있는 scala의 소수(prime) stream 예제

위 코드를 한글로 번역하면 2와 3 이상의 홀수 중에서 제곱해서 자신보다 작은 이미 찾아낸 소수들 모두로 나누어지지 않는 수가 된다. val로 정의되어 있으므로 이미 찾아낸 값을 다시 계산하지 않는다.

  1. 2
  2. 3 - 2*2 <= 3 이므로 primeStream에서 선택하지 않고 3을 채택

  3. 5 - takeWhile에서 선택되는 소수는 2. 2는 5%2!=0을 만족하므로 채택

  4. 7 - takeWhile에서 선택되는 소수는 2. 2는 7%2!=0을 만족하므로 채택

  5. 9 - takeWhile에서 선택되는 소수는 2,3. 9%3 == 0이므로 채택되지 않음

  6. 11 - takeWhile에서 선택되는 소수는 2,3. 2,3 모두 11 나누면 나머지가 있으므로 채택

위의 방식으로 계속 찾아내게 된다.

댓글

이 블로그의 인기 게시물

scite 한글 설정

터미널에서 스칼라 파일 직접 컴파일, 실행

로잉 머신 운동 2달째