0

只是一个简单的问题,我有一个 scala 代码,它可以找到二次方程的根。我遇到的问题是打印出多个答案并获得复数的答案。

PS:我在 Scala 课程的前几周,所以我只知道基本的基础知识。

val a = readDouble
val b = readDouble
val c = readDouble
if(b*b-4.*a*c > 0) //I have this to deal with the negatives :( {
val root1 = (-b + math.sqrt(b*b-4.*a*c)) / (2*a)
val root2 = (-b - math.sqrt(b*b-4.*a*c)) / (2*a)
println(root1 + " " root2)
}
else 
println("No root")

谢谢你,朋友!

4

2 回答 2

4

你应该把你的结果放在一个集合中,因为:

  • 可以有多个结果,所以它必须是一些集合
  • 您不想重复,Set 会为您消除它们

所以这样的事情应该有效:

def roots(a : Double, b : Double, c: Double)= {
  if (b*b-4.0*a*c >= 0) {
     Set(1,-1).map(-b + _ * math.sqrt(b*b-4.0*a*c))
  }else{
     Set()
  }
}

val a = readDouble
val b = readDouble
val c = readDouble

println(roots(a,b,c))

使用此函数,您可以获得以下结果:

scala> roots(2,3,4)
res4: scala.collection.immutable.Set[_ <: Double] = Set()

scala> roots(-2,3,4)
res5: scala.collection.immutable.Set[_ <: Double] = Set(3.4031242374328485, -9.403124237432849)

scala> roots(2,0,0)
res6: scala.collection.immutable.Set[_ <: Double] = Set(0.0)

对于复数,您可以使用spire。把上面的代码稍微改一下:

import spire.implicits._
import spire.math._

def roots(a : Complex[Double], b : Complex[Double], c: Complex[Double]) =
     Set(1,-1).map(-b + _ * (b*b-4.0*a*c).sqrt)
于 2013-09-20T07:32:24.207 回答
0

您的问题是高中数学问题,而不是 Scala 问题。一个二次方程总是有 2 个根(你的数学是一个二次方程)。如果 b*b-4*a*c 项是否定的,那么答案是复杂的(形式为 a + i*b),应该注意仍然有 2 个根。如果此项为零,则有两个具有相同值且始终为实数的根。如果该术语为正,则您有两个不同的实值根。在 Scala 中处理复数可以实现,如下所示

于 2013-09-21T15:26:30.667 回答