2011年1月13日木曜日

Scalaでユークリッドの互除法

単純なプログラムを書いてみた。
Scalaでユークリッドの互除法。


01
def baseEucledian(x:Int, y:Int):Int = {
02
  val a = if(x > 0) x else 1
03
  val b = if(y > 0) y else 1
04
  val tpl = if(a > b) (a, b) else (b, a)
05
  if(tpl._1 % tpl._2 == 0) tpl._2 else baseEucledian(tpl._2, tpl._1 % tpl._2)
06
}
07
def extEucledian(x:Int, y:Int):(Int, (Int, Int)) = {
08
  val q = baseEucledian(x, y)
09
  (q, (x / q, y / q))
10
}


02~04が美しくないので、少し書きなおしてみる。
02~04は交換をしているだけなので、交換を関数にする。


01
def baseChange(x:Int, y:Int):(Int,Int)  = {
02
  if(x > y) (x, y) else (y, x)
03
}


こうすると、02~04は次のように書き換えられる。


02
  val tpl = baseChange(baseChange(x, 1)._1, baseChange(y, 1)._1)


ずいぶん綺麗になった気がする。
scalaはリファクタリングが重要な言語らしい。

0 件のコメント:

コメントを投稿