我有一个名为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方式这样做?
答案 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
所做的。