【问题标题】:How fix type mismatch using tail recursion?如何使用尾递归修复类型不匹配?
【发布时间】:2019-04-10 07:50:37
【问题描述】:

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

这是我的功能

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

现在我有问题:“类型不匹配,找到:单位,需要:(List[Int], List[Int])”,在最后一个大括号中突出显示

【问题讨论】:

    标签: scala function functional-programming


    【解决方案1】:

    修复缺少的 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)
    }
    

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

    【讨论】:

    • 感谢您的帮助,解决问题真的很酷。但它有一个错误,当你有奇数个元素时,列表之间的变化:奇数索引排在第二位,偶数排在第一位
    • @Ilya;你读过我写的吗?我告诉关于列表顺序的问题。由于您已经将此问题标记为已解决,因此我没有费心去修复它。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,我刚刚忘记了)
    猜你喜欢
    • 1970-01-01
    • 2020-01-12
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2013-06-08
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多