2017-02-22 1 views
0
def solve(a: Double, b: Double, c: Double): Option[(Double, Double)]= { 
val disc = b*b - 4 * a * c; 
val root1 = (-b + disc)/2*a); 
val root2 = (-b - disc)/2*a); 
} 

나는 (root1, root2)가 튜플을 생성하고 Option 형식에서 튜플을 반환하고자 함을 알고 있습니다. 나는 스칼라에서 그것을하는 방법을 궁금해?스칼라에서 Option 유형으로 여러 값을 반환하려면 어떻게해야합니까?

+2

당신이 A'가 0 일 때'반환하려고하는거야? – Brian

+0

@ 브라이언 분명히 무한 :) – prayagupd

+1

@ 브라이언 나는'없음'을 추측하겠습니까? – Yawar

답변

2

, 하지만 그것의 전부는 아닙니다, 나는 생각합니다 : 뿌리 쌍 또는 None 중 하나를 리턴하는 2 차 방정식을 구현하십시오. 이 점을 감안할 때 현재 구현에서는 수식도 잘못 계산하고 있습니다. 참고로, 공식은 다음과 같습니다

x1 = (-b + sqrt(b^2 - 4ac))/2a 
x2 = (-b - sqrt(b^2 - 4ac))/2a 

올바른 구현 :

def solve(a: Double, b: Double, c: Double): Option[(Double, Double)] = { 
    val sqrtDiscriminant = Math.sqrt(b * b - 4 * a * c) 
    val twiceA = a * 2 

    if (a == 0) None 
    else 
    Some(
     ((-b + sqrtDiscriminant)/twiceA, 
     (-b - sqrtDiscriminant)/twiceA)) 
} 
0

정말 간단합니다.

Some((root1,root2)) 

Check out this article and the rest of the series

@WillD에서 제공하는 대답에서 귀하의 의견을 바탕으로, 당신이 예외가 발생하면이 경우 (아마도 root1 또는 root2 중 하나를 계산?에서) None을 반환 할 것으로 보인다
+0

아무 것도 구현하지 않으려 고 노력했기 때문에 붙어있었습니다. 예를 들어 (1,0,1)을 풀려고하면 아무 것도 반환하지 않습니다. – user21478621

+0

당신은 아무 것도 작동시키지 않았습니까? – WillD

0

, 당신은 scala.util.Try 각 계산을 둘러싸고, 그리고 각 결과를 변환 할 수있는 Option :

import scala.util.Try 

def solve(a: Double, b: Double, c: Double): Option[(Double, Double)] = { 
    val disc = b*b - 4 * a * c 
    val root1: Option[Double] = Try((-b + disc)/(2*a)).toOption 
    val root2: Option[Double] = Try((-b - disc)/(2*a)).toOption 

    // If both `root1` and `root2` are calculated successfully, return the tupled values. 
    for { 
    r1 <- root1 
    r2 <- root2 
    } yield { 
    (r1, r2) 
    } 
} 

우리는 값이 메서드를 호출 할 때

scala> solve(0,1,0) 
res0: Option[(Double, Double)] = Some((NaN,-Infinity)) 

내가 왜 전혀 모르겠지만, 나는 그것이 Double의 부정확성과 관련이있다 생각 : 0, 10, 우리는 뭔가 이상한 일이 알 수 있습니다. 다행히 누군가가 NaN-Infinity을 반환하는 이유에 대해 더 나은 대답으로 전화를 걸 수 있기를 바랍니다. 그러나 우리가 BigDecimalDouble의 모든 항목을 대체 할 경우, 우리는 더 나은 정밀도를 얻을뿐만 아니라, 원하는 출력 :

다른 대답은 당신이해야 할 노력하고 추측하고있어 무엇의 일부를 포함
import scala.util.Try 

def solve(a: BigDecimal, b: BigDecimal, c: BigDecimal): Option[(BigDecimal, BigDecimal)] = { 
    val disc = b*b - 4 * a * c 
    val root1: Option[BigDecimal] = Try((-b + disc)/(2*a)).toOption 
    val root2: Option[BigDecimal] = Try((-b - disc)/(2*a)).toOption 

    // If both `root1` and `root2` are calculated successfully, return the tupled values. 
    for { 
    r1 <- root1 
    r2 <- root2 
    } yield { 
    (r1, r2) 
    } 
} 

scala> solve(0,1,0) 
res1: Option[(BigDecimal, BigDecimal)] = None