我是Scala的新手,我正在尝试创建一个函数来计算某个对象在序列中出现的数量。在这种情况下,我们有一个序列,其中有1只河马和3只老虎。我想知道序列中老虎的数量。所以函数amountOfTigers的结果应该是一个整数:3。我想利用模式匹配和递归来解决这个问题。但是我真的不知道该怎么做。
sealed trait Animal
case class Hippo(name: String, age: Int) extends Animal
case class Tiger(name: String, age: Int) extends Animal
def amountOfTigers(animals: Seq[Animal]): Int = animals match {
case head +: tail => if (head.isInstanceOf[Tiger]) println(head); amountOfTigers(tail)
}
val data = Seq[Animal](
Hippo("Mino", 4),
Tiger("Justin", 1),
Tiger("Jason", 20),
Tiger("Sloop", 10)
)
amountOfTigers(data)
println用于测试目的。我现在得到的输出是:老虎(贾斯汀,1)老虎(杰森,20)老虎(单桅帆船,10)
我想要的结果是序列中tiger的数量。在这个例子中是3。
如果你想避免递归(我个人建议在这种情况下-因为它只是一个普通的数据数组),我建议你使用循环,这样:
def amountOfTigers(animals: Seq[Animal]): Int = animals.count(_.isInstanceOf[Tiger])
如果你坚持使用递归,我建议使用@tailrec
,正如Christian所暗示的:
def amountOfTigersRec(animals: Seq[Animal]): Int = {
@tailrec
def rec_fun(tail: Seq[Animal], count: Int): Int = tail match {
case Tiger(_, _) +: tail => rec_fun(tail, count + 1)
case _ +: tail => rec_fun(tail, count)
case Nil => count
}
rec_fun(animals, 0)
}
这是一个例子:
sealed trait Animal
case class Hippo(name: String, age: Int) extends Animal
case class Tiger(name: String, age: Int) extends Animal
def amountOfTigers(animals: Seq[Animal]): Int = animals match {
case Seq() => 0
case Tiger(_, _) +: tail => amountOfTigers(tail) + 1
case head +: tail => amountOfTigers(tail)
}
val data = Seq[Animal](
Hippo("Mino", 4),
Tiger("Justin", 1),
Tiger("Jason", 20),
Tiger("Sloop", 10)
)
print(amountOfTigers(data))
您可能想要查看的内容:
- 如何在Scala中进行模式匹配:https://docs.scala-lang.org/tour/pattern-matching.html因为你很少在Scala中使用isInstanceOf
- 对于递归函数,通常从简单的情况开始考虑。这里:一个空序列没有老虎。 注意,这个例子不是很有效,因为它不是尾部递归的。尾部递归由Scala编译器优化为循环。如欲了解更多详情,请参阅https://www.geeksforgeeks.org/tail-recursion-in-scala/。