有没有办法在Scala中突破@tailrec?

有没有办法在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

我有一个递归的方法。在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 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