我正在尝试在scala中编写一个递归函数,该函数接收一个字符串列表并返回一个包含原始列表中交替元素的列表:
例如:
列出a = {“a”,“b”,“c”} 列表b = {“a”,“c”}
应始终包括头部。
def removeAlt(list:List[String], str:String):List[String]=lst match{
case Nil=> List()
case => head::tail
if(head == true)
removeAlternating(list,head)
else
head::removeAlternating(list,head)
我收到堆栈溢出错误。
我理解代码是不正确的,但我试图理解如何通过递归和没有内置类来实现这一点的逻辑。
答案 0 :(得分:3)
def remove[A](xs:List[A]):List[A] = xs match {
case Nil => Nil
case x::Nil => List(x)
case x::y::t => x :: remove(t)
}
如果列表为空,则返回一个空列表。 如果我们在列表的最后一个元素,请返回。 否则,必须有两个或更多元素。将第一个元素添加到列表其余部分的备用元素(并省略第二个元素)
答案 1 :(得分:0)
很棒的运动。这就是我提出的。它不是超级优化或任何东西:
def altList[T](rest: List[T], skip: Boolean): List[T] = {
rest match {
case Nil => Nil
case a :: tail if skip == false => a :: altList(tail, true)
case a :: tail if skip == true => altList(tail, false)
}
}
答案 2 :(得分:0)
更短的选择:
def remove[A](xs:List[A]):List[A] = xs match {
case x::_::t => x :: remove(t)
case _ => xs
}
更新
上述方法不太好用于长列表的最终堆栈溢出,所以我建议尾递归:
import scala.annotation.tailrec
def remove[A](xs:List[A]):List[A] = {
@tailrec
def remove_r(xs:List[A], ys:List[A]):List[A] = xs match {
case x::_::t => remove_r(t, x::ys)
case _ => xs ++ ys
}
remove_r(xs, Nil).reverse
}