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

时间:2018-11-06 21:09:44

标签: scala function functional-programming

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

这是我的职能

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

结果它必须返回(List(2,7,0,1),List(6,9,4))

现在我遇到问题:“类型不匹配,找到:单位,必需:(列表[Int],列表[Int])”,最后大括号突出显示

2 个答案:

答案 0 :(得分:2)

group2定义了一个函数,但实际上并未执行。定义group2helper后,请确保调用它,并且应该没问题。

答案 1 :(得分:2)

修复了丢失的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)
}

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