2016-11-29 3 views
1

저는 스칼라에서 한 줄에 LCM을 구현하려고합니다.FP 1 줄의 스칼라에있는 LCM

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) 

가 어떻게 LCM 내부 람다에 GCD 심자 것 :

이 내가이 개 기능을 구현했습니다 어떻게?

+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} 

는 (여기에는 약간 더 읽기 쉬운 형식으로되어 있습니다.) 이미 생각 스칼라 라이브러리에 존재하지 않는 수정 점 연산자의 일종 (없이

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 
}