2016-11-29 1 views
1

Ich versuche LCM in einer Zeile in Scala zu implementieren. DieseFP LCM in Scala in 1 Zeile

ist, wie ich es mit 2 Funktionen implementiert haben:

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) 

Wie würden Sie gcd in einen Lambda innerhalb LCM konvertieren?

+1

ohne irgendeine Art von Festpunkt-Operator (das glaube ich nicht existiere bereits in den Bibliotheken Scala - man kann definiere es, aber das ist eine zusätzliche Zeile), ich glaube nicht, dass du das tun kannst. Das Problem ist, dass "GCD" anonym, aber auch rekursiv sein muss. – Alec

+0

@Alec Ich bin gespannt auf eine Antwort mit Fixpunkten – soote

Antwort

1

Sie benötigen eine GCD-Berechnung, die nicht rekursiv ist.

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} 

(Hier ist es in einem leicht besser lesbaren Format.)

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 
}