如何使用尾部递归修复类型不匹配



我需要按索引号将一个列表分为两个,如果奇数到第一个列表,如果偶数到第二个列表。

这是我的功能

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](",在最后一个大括号处突出显示

修复丢失的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的内容都是正确的。


OK,所以有一个简单的解决输出列表顺序问题的方法。

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

这是对原始的一次两个处理的返回,但有两种不同的终止模式。

group2定义了一个函数,但实际上并没有执行它。在定义了group2helper之后,请确保您调用了它,这样就可以了。

最新更新