1 行 scala 中的 FP LCM

FP LCM in scala in 1 line

我正在尝试在 Scala 中一行实现 LCM。

这就是我用 2 个函数实现它的方式:

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)

如何将 gcd 转换为 lcm 中的 lambda?

您需要一个非递归的 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}

(这里是稍微更易读的格式。)

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
}