这是我为使用带尾递归的累加器连接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
的成员所以我似乎不能将这些元素添加到此列表中?
答案 0 :(得分:0)
当您撰写x :: y
时,y
必须是一个列表,x
是您要添加的元素。
您可以使用acc :+ h1 :+ h2
将h1
和h2
附加到acc
,但请注意,在列表末尾添加元素是一项相对昂贵的操作(线性与列表的长度)。