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

时间:2013-06-07 11:41:42

标签: 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 element :: rest if element.getElementType == ElementType.BOOK => {
      elementList.append(element.getBook) 
      getLooks(rest)
    }
    case _ => getBooks(elements.tail)
  }
}

2 个答案:

答案 0 :(得分:1)

我想最简单的方法就是在你的if语句中包含match语句,如下所示:

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)
    }
  }
}

答案 1 :(得分:0)

一般来说,您可以尝试传递递归中剩余元素的数量。

例如:

  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()