Как преобразовать этот групповой список в простую рекурсию? - PullRequest
0 голосов
/ 12 ноября 2018

Я пишу функцию, которая группирует элементы списка по индексу, с нечетным индексом в первом списке, даже во втором. Но я не знаю, как сделать это с помощью простой рекурсии и не получить несоответствие типов.

Вот код:

// Simple recursion
def group1(list: List[Int]): (List[Int], List[Int]) = list match {
  case Nil => (Nil, Nil)
  case head :: Nil => (List(head), Nil)
  case head :: tail => // how can I make this case?
}

group1(List(2, 6, 7, 9, 0, 4, 1))

// Tail recursion
def group2(list: List[Int]): (List[Int], List[Int]) = {
  def group2Helper(list: List[Int], listA: List[Int], listB: List[Int]): (List[Int], List[Int]) = list match {
    case Nil => (listA.reverse, listB.reverse)
    case head :: Nil => ((head :: listA).reverse, listB.reverse)
    case head :: headNext :: tail => group2Helper(tail, head :: listA, headNext :: listB)
  }
  group2Helper(list, Nil, Nil)
}

group2(List(2, 6, 7, 9, 0, 4, 1))

1 Ответ

0 голосов
/ 12 ноября 2018

Вы должны вызвать следующую рекурсию, распаковать результирующий кортеж, предварительно привязать каждый элемент head к правильному List и упаковать новый кортеж результата.

def group1(list: List[Int]) :(List[Int], List[Int]) = list match {
  case Nil                => (Nil, Nil)
  case head :: Nil        => (List(head), Nil)
  case hdA :: hdB :: tail => val (lstA, lstB) = group1(tail)
                             (hdA :: lstA, hdB :: lstB)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...