ScalaでProject Euler(8)

Problem 3

パターンマッチ

パターンマッチを使えばもう少しきれいに書けます。パターンマッチは、switch〜case〜を拡張したようなものです。こんな感じに使います。

def count(n :Int) = n match {
    case 1 => "1"
    case 2 => "2"
    case _ => "たくさん"
}

println (count(3))      // たくさん

ワイルドカード的な意味で_が使えます。
caseの中でifを使うこともできます。

def count(n :Int) = n match {
    case 1 => "1"
    case 2 => "2"
    case _ if n % 2 == 0 => "偶数のたくさん"
    case _               => "奇数のたくさん"
}

もっと複雑なマッチングもできます。例えばタプルに対して、

def Ack(m :Int, n :Int) :Int = (m, n) match {
    case (0, n) => n + 1
    case (m, 0) => Ack(m - 1, 1)
    case _      => Ack(m - 1, Ack(m, n - 1))
}

こんな風にきれいに書けます。
結局、この問題はこうなりました。

def factorize(n :Long, p :Long = 2L) :List[Long] = n match {
    case 1                  => Nil
    case _ if p * p > n     => List(n)
    case _ if n % p == 0    => n :: factorize(n / p, p)
    case _                  => factorize(n, p + 1)
}