2016-11-29 15 views
1

私はScalaの1行にLCMを実装しようとしています。あなたはLCM内部ラムダにGCD変換する方法をFP LCM in scala in 1 line

def gcd(a: BigInt, b: BigInt):BigInt=if (b==0) a.abs else gcd(b, a%b) 
def lcm(list: Seq[BigInt]):BigInt=list.foldLeft(BigInt(1))((a, b) => (a/gcd(a,b))*b) 

これは、私は2つの機能とそれを実装しました方法ですか?

+1

- あなたは可能性それを定義しますが、余分な行です)、私はあなたがこれを行うことはできないと思います。問題は 'gcd'が匿名であることだけでなく、再帰的にも必要であるということです。 – Alec

+0

@Alec固定小数点を使って答えが分かりました – soote

答えて

1

再帰的でないGCD計算が必要です。

def lcm(list: Seq[BigInt]):BigInt=list.foldLeft(1:BigInt){(a,b) => b*a/Stream.iterate((a,b)){case (x,y) => (y, x%y)}.dropWhile(_._2 != 0).head._1.abs} 

は(ここでは、わずかより読みやすい形式である。)私はすでに考えてScalaのライブラリに存在していない固定小数点演算のいくつかの並べ替え(なし

def lcm(list: Seq[BigInt]):BigInt=list.foldLeft(1:BigInt){ 
    (a, b) => b * a/
    Stream.iterate((a,b)){case (x,y) => (y, x%y)}.dropWhile(_._2 != 0).head._1.abs 
}