2017-02-22 72 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元素中的元组类型。我想知道如何在Scala中做到这一点?如何在Scala中的Option类型中返回多个值?

+2

什么是你想返回的时候'了'为0? – Brian

+0

@布莱恩显然无限:) – prayagupd

+1

@布莱恩我会猜'没有'? – Yawar

回答

2

其他的答案包括什么,我猜你正在试图做的部分,但不是它的全部,我认为这是:实现二次公式返回一对根或None如果没有解决方案。鉴于此,您当前的实施也正在计算公式不正确。作为参考,其公式为:

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

基于由@WillD提供的答案您的评论,似乎要返回None发生异常时(大概在计算或者root1root2?)在这种情况下,你可以围绕每一个计算与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) 
    } 
} 

当我们调用此方法与价值010,我们注意到一些奇怪的事情发生了:

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

我不完全知道为什么,但我相信它有与Double不精确做。希望别人能够更好地回答这个问题,为什么这会返回NaN-Infinity。但是,如果我们用BigDecimal取代的Double所有出现,我们得到更好的精确度,以及所需的输出:

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 
相关问题