Saq*_*Ali 3 recursion functional-programming scala tail-recursion scala-collections
我具有以下递归函数,用于从另一个列表(pets:List [String])中包含的列表(zooResidents:List [(String,Int)])中删除项目。它可以工作,但是非常慢。什么是斯卡拉这样的方式?
val pets = List("cat", "dog")
val zooResidents = List(("cat", 4), ("lion", 2), ("tiger", 3), ("dog", 2)
def removePets(zooResidents: List[(String, Int)], pets: List[String]): List[(String, Int)] = {
if (pets.isEmpty) zooResidents
else removePets(zooResidents.filterNot(_._1.contains(pets.head)), pets.tail)
}
removePets(zooResidents, pets) //> res2: List[(String, Int)] = List((lion,2), (tiger,3))
Run Code Online (Sandbox Code Playgroud)
请注意,它List#contains
是线性的,因为它必须扫描整个列表,我建议您使用具有恒定时间查找的数据结构,例如Set
val petSet = pets.toSet
val filter = zooResidents.filterNot(element => petSet.contains(element._1))
Run Code Online (Sandbox Code Playgroud)