Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

ScalaのSnippetを写経する(9)-for文の応用

Scalaではfor文に条件を書いてfilterかけれる。
Snippet: Primes | The Scala Programming Language
Primeってのは素数のことね。まだ学術的段階だから?複素数とか素数とか数学のサンプルとか多いね。

package sample.snippet

object Primes extends Application {

  def isPrime(n: Int) = {
    (2 until n) forall (n % _ != 0) 
  }
  for(i <- 1 to 100 if isPrime(i))
    printf("%d,", i)
}

先にisPrimeメソッドを解説。
2 until n で2からnまで(nは含まない)。nが9なら2,3,4,5,6,7,8ってこと。
さらにtoも出てくるけど、こういう記述はRangeオブジェクトとして扱われるらしい。
Rangeのスーパークラス(trait)にIterableがあって、そこにfotallメソッドが定義されてる。

forall(p : (A) => Boolean) : Boolean
Apply a predicate p to all elements of this iterable object and return true, iff the predicate yields true for all elements.

すべての要素が関数を満たしていればtrueを返し、1つでも関数を満たさなければfalseを返すメソッド。
ここでは、ある数nを2からn - 1までの数すべてで除算しても割り切れないことを確かめてる。
# 素数は1と自分自身以外割り切れない数だからね。
「_」はレシーバの省略記述。2からn - 1までの数が毎回代入される。


で、for文。1 to 100は1から100まで(100を含む)。
その後if文で条件を指定してる。この受験に当てはまらない場合ループをスキップすることになる。
今回はif文だけど、パターンマッチングも書けるらしい。


実行結果。

1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,

1から100までの素数が出力される。

ん?待てよ?

1は素数か??たしか素数ではないはず。

  def isPrime(n: Int): Boolean = {
    if(n == 1) return false;
    (2 until n) forall (n % _ != 0) 
  }

でないとダメなんじゃない?