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 件のコメント:
コメントを投稿