scala - 递归列表连接

标签 scala functional-programming

我有以下函数返回整数列表的元素之间的距离列表:

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/

相关文章:

scala - 在 Scala 中重新排序序列

scala - 无法使用 Gradle 运行 Scalatest

scala - 星火笔记本 : How can I filter rows based on a column value where each column cell is an array of strings?

Java 打印编写器环绕

javascript - 如何将嵌套 for 循环转换为 JavaScript 中的声明语句

functional-programming - 新的 OCaml : How would I go about implementing Gaussian Elimination?

Scala Function.tupled 与 f.tupled

java - 如何将 JDBC 驱动程序作为系统依赖项放置在开发模式下的 SBT 项目 Scala/Play 项目中

javascript - 使用 array.reduce 以逗号连接字符串,但要避免额外的逗号

Python 使用累加器和任意 lambda 函数减少?