在Scala中连接多个列表

时间:2016-06-25 03:24:33

标签: scala recursion scala-collections tail-recursion

我有一个名为generateList和concat函数的函数如下。它本质上是连接generateList返回的列表,其中i从24开始,到1

结束
 def concat(i: Int, l: List[(String, Int)]) : List[(String, Int)] = {
          if (i==1) l else l ::: concat(i-1, generateList(signs, i))
 }
 val all = concat(23, generateList(signs, 24))

我可以将其转换为尾递归。但我很好奇是否有scala方式这样做?

2 个答案:

答案 0 :(得分:1)

使用Scala可用于列表的内置方法,有很多方法可以做到这一点。

这是一种使用foldRight

的方法
(1 to 24).foldRight(List[Int]())( (i, l) => l ::: generateList(i))

从用于构建单独列表的整数范围开始,它将generateList(i)的结果连接到初始空列表。

答案 1 :(得分:0)

以下是一种方法:

val signs = ""
def generateList(s: String, n: Int) = n :: n * 2 :: Nil


scala> (24 to 1 by -1) flatMap (generateList(signs, _))
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(24, 48, 23, 46, 22, 44, 21, 42, 20, 40, 19, 38, 18, 36, 17, 34, 16, 32, 15, 30, 14, 28, 13, 26, 12, 24, 11, 22, 10, 20, 9, 18, 8, 16, 7, 14, 6, 12, 5, 10, 4, 8, 3, 6, 2, 4, 1, 2)

您要做的是使用x => generateList(signs, x)函数映射列表,然后连接结果,即展平列表。这正是flatMap所做的。