パターンマッチ
パターンマッチを使えばもう少しきれいに書けます。パターンマッチは、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) }