我有以下函数返回整数列表的元素之间的距离列表:
def dists(l: List[Int]) = {
//@annotation.tailrec
def recurse(from: Int, rest: List[Int]): List[Int] = rest match {
case Nil => Nil
case to :: tail => to - from :: recurse(to, tail)
}
l match {
case first :: second :: _ => recurse(first, l.tail)
case _ => Nil
}
}
::
阻止我使用 @tailrec
注释,尽管对 recurse
的调用似乎处于尾部位置。
是否有 @tailrec
兼容的方式来进行连接?
我可以使用累加器,但我必须将输入或输出取反,对吧?
编辑:我对递归方法特别感兴趣。我的具体用例有点复杂,因为调用 recurse
可能会向结果列表添加多项:
=> item1 :: item2:: recurse(...)
距离函数只是一个演示问题的例子。
最佳答案
这不是对原始请求的回复,而是问题的替代解决方案。
您可以简单地压缩列表,将相同的列表“移动”一个位置,然后将生成的压缩列表映射到元组元素的差异。
在代码中
def dist(l: List[Int]) = l.zip(l drop 1) map { case (a,b) => b - a}
如果您无法理解发生了什么,我建议拆分操作并在 REPL 上探索
scala> val l = List(1,5,8,14,19,21)
l: List[Int] = List(1, 5, 8, 14, 19, 21)
scala> l zip (l drop 1)
res1: List[(Int, Int)] = List((1,5), (5,8), (8,14), (14,19), (19,21))
scala> res1 map { case (a, b) => b - a }
res2: List[Int] = List(4, 3, 6, 5, 2)
关于scala - 递归列表连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16279628/