有没有办法在Scala中突破@tailrec?
我有一个递归的方法。在scala中是否有一种方法可以根据缓冲区的大小进行分解(如下所示)?例如,当elementList.size>5时爆发的情况有没有办法在Scala中突破@tailrec?,scala,tail-recursion,Scala,Tail Recursion,我有一个递归的方法。在scala中是否有一种方法可以根据缓冲区的大小进行分解(如下所示)?例如,当elementList.size>5时爆发的情况 val elementList = ListBuffer.empty[Book] @tailrec def getBooks(elements: List[Element]) { elements match { case Nil => info("Reached end of elements list.") case e
val elementList = ListBuffer.empty[Book]
@tailrec
def getBooks(elements: List[Element]) {
elements match {
case Nil => info("Reached end of elements list.")
case element :: rest if element.getElementType == ElementType.BOOK => {
elementList.append(element.getBook)
getLooks(rest)
}
case _ => getBooks(elements.tail)
}
}
我想最简单的方法就是在你的
match
语句周围包装一个if
语句,如下所示:
val elementList = ListBuffer.empty[Book]
@tailrec
def getBooks(elements: List[Element]) {
if (elementList.size <= 5){
elements match {
case Nil => info("Reached end of elements list.")
case element :: rest if element.getElementType == ElementType.BOOK => {
elementList.append(element.getBook)
getLooks(rest)
}
case _ => getBooks(elements.tail)
}
}
}
val elementList=ListBuffer.empty[Book]
@泰勒克
def getBooks(元素:列表[元素]){
if(elementList.size信息(“已到达元素列表的末尾”)
case元素::rest if element.getElementType==ElementType.BOOK=>{
elementList.append(element.getBook)
getLooks(休息)
}
case=>getBooks(elements.tail)
}
}
}
一般来说,您可以尝试传递递归中剩余元素的数量
例如:
def get(list: List[Int], max: Int): List[Int] = {
@tailrec
def get(list: List[Int], acc: List[Int], remaining: Int): List[Int] = {
list match {
case h :: tail if remaining > 0 =>
get(tail, h :: acc, remaining - 1)
case _ =>
acc
}
}
// Requires reverse() !
get(list, Nil, max).reverse
至于累加器:您可以使用一个缓冲区来代替,以防止最后出现
reverse()
。考虑使用标准函数,如elements.filter(uu.getElementType==ElementType.BOOK)。假设(5)您可以使用nuclear选项并写入return
。如果elementList.size>5=>,也可以添加一个额外的case xs