После того, как вы исправите пропущенный вызов 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)
}
Это возврат к исходной обработке по два, но с двумя разными шаблонами завершения.