2013-06-07 2 views
2

У меня есть метод, который является рекурсивным. Есть ли способ в scala вырваться на основе размера буфера (как показано ниже)? Случай для разрыва, когда elementList.size> 5, например?Есть ли способ вырваться из @tailrec в Scala?

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

Рассмотрите возможность использования стандартных функций, таких как elements.filter (_. GetElementType == ElementType.BOOK) .take (5) – vitalii

+1

Вы можете использовать ядерную опцию и написать '' return''. – janm399

ответ

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

В качестве альтернативы можно добавить дополнительный «случай xs», если elementList.size> 5 =>() ' –

0

Genereally говоря, Вы могли бы попытаться пройти вниз количество оставшихся элементов в рекурсии.

Например:

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() в конце.

 Смежные вопросы

  • Нет связанных вопросов^_^