将元素排序为2个列表的连接元素的一部分

时间:2014-06-08 12:02:41

标签: scala

这是我为使用带尾递归的累加器连接List的元素而编写的函数:

val l1 = List(1, 2, 3)                          //> l1  : List[Int] = List(1, 2, 3)
  val l2 = List(1, 2, 3)                          //> l2  : List[Int] = List(1, 2, 3)

  def func(l1: List[Int], l2: List[Int], acc: List[Int]): List[Int] = {
    (l1, l2) match {
      case (Nil, Nil) => acc.reverse
      case (h1 :: t1, h2 :: t2) => {
        func(t1, t2, h1 :: h2 :: acc)
      }
    }
  }                                               //> func: (l1: List[Int], l2: List[Int], acc: List[Int])List[Int]

  func(l1, l2, List())                            //> res0: List[Int] = List(1, 1, 2, 2, 3, 3)

这是我对通话订单的理解

  func( 1 :: 1 :: () )
  func( 2 :: 2 :: 1 :: 1 : () )
  func( 3 :: 3 :: 2 :: 2 :: 1 :: 1 : () )

因此,调用顺序是我必须在acc的基本调用上调用reverse的原因,以便List在相同的排序初始List元素中排序。为了尽量减少连接列表所需的步骤,我尝试添加如下元素:

func(t1, t2, acc :: h1 :: h2)

而不是

func(t1, t2, h1 :: h2 :: acc)

但收到编译时错误:

value ::不是Int

的成员

所以我似乎不能将这些元素添加到此列表中?

1 个答案:

答案 0 :(得分:0)

当您撰写x :: y时,y必须是一个列表,x是您要添加的元素。

您可以使用acc :+ h1 :+ h2h1h2附加到acc,但请注意,在列表末尾添加元素是一项相对昂贵的操作(线性与列表的长度)。