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