[英]Recursively iterate through a Scala list
我正在尝试使用模式匹配递归遍历 Scala 中的列表。 我不能使用任何列表函数或 while/for 循环。 我需要做的是遍历列表,如果匹配为“4”,则删除一个元素。 我是 Scala 的新手,在我拥有的教科书和谷歌上都找不到答案。 其他人都使用过滤器方法或其他一些列表方法。
这是我试图做的(这是错误的)
def removeFours(lst: List[Int]): List[Int] = {
val newLst = lst
lst match {
case Nil => Nil
case a if a == 4 => newLst -= 0
case n => removeFours(newLst)
}
newLst
}
看看这是否适合你。
def removeFours(lst: List[Int], acc: List[Int] = List.empty): List[Int] = {
lst match {
case Nil => acc.reverse
case 4 :: t => removeFours( t, acc )
case h :: t => removeFours( t, h :: acc )
}
}
用法:
scala> removeFours( List(3,7,4,9,2,4,1) )
res84: List[Int] = List(3, 7, 9, 2, 1)
使用内部函数和模式匹配来解构列表。 如果列表中的头是4
,则不要将其添加到累加器中。 如果是,则将其附加到累加器。
def removeFours(lst: List[Int]): List[Int] = {
def loop(lst: List[Int], acc: List[Int]): List[Int] = lst match {
case Nil => acc
case h :: t =>
if (h == 4) {
loop(t, acc)
}else{
loop(t, acc :+ h)
}
}
loop(lst, List())
}
执行此操作的首选方法是在模式匹配中使用守卫,但如果您刚刚开始使用 scala,则 if else 语句可能看起来更熟悉。
def removeFours(lst: List[Int]): List[Int] = {
def loop(lst: List[Int], acc: List[Int]): List[Int] = lst match {
case Nil => acc
case h :: t if (h == 4) => loop(t, acc)
case h :: t => loop(t, acc :+ h)
}
loop(lst, List())
}
我不确定执行时间。 我也是 scala 的新手,但我正在采用布尔方法来过滤任何列表。
object Main extends App {
//fun that will remove 4
def rm_4(lst: List[Int]) : List[Int] = {
val a = lst.filter(kill_4)
a
}
// boolean fun for conditions
def kill_4(n: Int) : Boolean = {
if (n ==4) false
else true
}
println(rm_4(List(1,2,4,5,4))) // outpur List(1,2,5)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.