如何解决使用尾递归和匹配表达式删除列表中所有出现的元素
任务是使用尾递归和匹配表达式删除列表中所有出现的元素。
remove(List(2,1,4,3,2),1),should return : List(2,2)
这是一个伪代码,仅适用于第一次出现。有人可以指导我如何做,以便消除所有出现的情况吗? 伪代码
import scala.annotation.tailrec
object Test extends App{
def remove[A](l: List[A],el: A): List[A] = {
@tailrec
def helper(l: List[A],acc: List[A] = List[A]()): List[A] = {
l match {
case head :: tail if (head != el) => helper(tail,head::acc)
case head :: tail if (head == el) => (acc.reverse ::: tail)
case _ => acc
}
}
helper(l)
}
print(remove(List(2,1))
}
解决方法
您的第二个模式不是递归的,实际上它在第一次匹配时以整个尾部结束递归。
进一步提示:您正在以相反的顺序构建累加器,您可以避免最终使用 :+ 将其反转以追加到队列中
def remove[A](l: List[A],el: A): List[A] = {
@tailrec
def helper(l: List[A],acc: List[A] = List[A]()): List[A] = {
l match {
case head +: tail => helper(tail,if(head != el) acc:+head else acc)
case _ => acc
}
}
helper(l)
}
print(remove(List(2,1,4,3,2),1))
根据 jwvh 评论,这应该更快
import scala.annotation.tailrec
def remove[A](l: List[A],if(head != el) head+:acc else acc)
case _ => acc.reverse
}
}
helper(l)
}
print(remove(List(2,1))
,
import scala.annotation.tailrec
object Zad3lab04 extends App{
def remove[A](l: List[A],el: A): List[A] = {
@tailrec
def helper(l: List[A],acc: List[A] = List[A]()): List[A] = {
l match {
case head :: tail if (head != el) => helper(tail,head::acc)
case head :: tail if (head == el) => helper(tail,acc)
case _ => acc
}
}
helper(l)
}
print(remove(List(2,1))
}
这有效,以不同的顺序打印列表,如果有人知道你为什么可以告诉我。但它工作得很好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。