我有以下函数返回一个整数列表中的元素之间的距离的列表:递归列表连接
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(...)
距离函数只是为了说明问题的例子。
我发现很多次,积累和倒退比我尝试过的其他替代方案快。它总是取决于具体情况,但不要害怕扭转。 – huynhjl 2013-04-29 14:47:30
我认为积累+逆转是现在的方式。谢谢! – 2013-04-29 15:29:19
积累和反转的通常替代方法是差异列表的概念,其中积累了通过附加而不是列表本身来建立列表的函数。这可能不适用于JVM,虽然... – 2013-04-29 16:36:19