2017-02-22 69 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 
相關問題