Skip to content

Instantly share code, notes, and snippets.

@daiksy
Created October 31, 2012 11:20
Show Gist options
  • Save daiksy/3986524 to your computer and use it in GitHub Desktop.
Save daiksy/3986524 to your computer and use it in GitHub Desktop.
Scalaでコラッツ数列を実装してみた。
/**
* 『すごいHaskell』で実装例が出ていたコラッツ数列をScalaで実装
*
* コラッツ数列とは:
* ・任意の自然数から開始する
* ・数が1ならば、終了
* ・数が偶数ならば、2で割る
* ・数が奇数ならが、3倍して1を足す
* ・新しい値でこのアルゴリズムを繰り返す
*
**/
object collatzApp extends App {
collatz(10) foreach println // 結果は [10,5,16,8,4,2,1]
def collatz(number: Int): List[Int] = {
implicit def int2exInt(n: Int) = new exInt(n)
number match {
case 1 => List(1)
case n if n.isEven => List(n) ++ collatz(n / 2)
case n if n.isOdd => List(n) ++ collatz((n * 3) + 1)
}
}
/**
* ScalaのIntには偶数か奇数かを検査する関数が無いので,
* 拡張するクラスを実装. implicit defで変換して使う.
*/
class exInt(val n: Int) {
lazy val isEven = n % 2 == 0
lazy val isOdd = n % 2 != 0
}
}

exInt は別にわざわざ実装するほどのものではないけど,implicit defを書いてみたくてw

でもこの例だと末尾再帰になってないからあんまり良い実装ではない.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment