再帰

Scalaの勉強を再開した。
Ninety-Nine Scala Problems

とりあえず今日は第一問目。

scala> last(List(1, 1, 2, 3, 5, 8))
res0: Int = 8

こんな関数lastを作りなさい、と。
で、作ったのはこれ。

def last[T](ls:List[T]):T = {
  l(ls.size - 1)
}

答えはコレだった。

def last[T](ls:List[T]):T = ls match {
  case h::Nil => h
  case _::tail => last(tail)
  case _ => throw new NoSuchElementException
}

あらら・・。
よく英語を読むと、Prologからの移植で、再帰の練習問題っぽい。なるほど。
Scalaのパターンマッチの柔軟さがよくわかって勉強になるけど、実際、どっちのスタイルで書くべきなんだろう。今回くらいの簡単なものなら上のほうが一見行数も少ないし(下同様にエラーチェックするともう一行追加しないといけないけど)良さそうに思えるものの、もう少し複雑な処理なら下のスタイルのほうがいい感じになるのかな。
もう少し経験を積む事が必要だ。