Как исправить несоответствие типов с помощью хвостовой рекурсии? - PullRequest
0 голосов
/ 07 ноября 2018

Мне нужно сгруппировать один список в два по порядковым номерам, если он нечетен для первого списка, если даже для второго.

Вот моя функция

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, listB)
    case head :: tail => group2Helper(tail.tail, listA ::: List(head), listB ::: List(tail.head))
 }
}

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

В результате он должен вернуться (Список (2, 7, 0, 1), Список (6, 9, 4))

Теперь у меня есть проблема: "Несоответствие типов, найдено: Единица, требуется: (List [Int], List [Int])", которая выделена на последней фигурной скобке

Ответы [ 2 ]

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

После того, как вы исправите пропущенный вызов group2helper(), ваш код все равно не будет работать, потому что вы обрабатываете входные данные по два за раз, но входные данные List содержат нечетное количество элементов, что приведет к ошибке времени выполнения. .

Другой подход состоит в том, чтобы обрабатывать ввод по одному и продолжать менять, к какому списку добавляется.

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 hd :: tl => group2Helper(tl, listB, hd :: listA)
  }
  group2Helper(list, Nil, Nil)
}

group2(List(2, 6, 7, 9, 0, 4, 1))
//res0: (List[Int], List[Int]) = (List(6, 9, 4),List(2, 7, 0, 1))

Две вещи, на которые стоит обратить внимание: 1) При построении List часто более эффективно предварительно откладывать (т.е. строить его назад), а затем реверсировать результат, и 2) порядок выходных списков будет зависеть от того, вход имеет четное или нечетное количество элементов, но содержимое каждого вывода List будет правильным.


ОК, так что есть простое решение проблемы порядка вывода списков.

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 hd :: Nil    => ((hd::listA).reverse, listB.reverse)
    case a :: b :: tl => group2Helper(tl, a::listA, b::listB)
  }
  group2Helper(list, Nil, Nil)
}

Это возврат к исходной обработке по два, но с двумя разными шаблонами завершения.

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

group2 определяет функцию, но фактически не выполняет ее. После того, как вы определили group2helper, убедитесь, что вы его называете, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...