gpt4 book ai didi

scala - 递归列表连接

转载 作者:行者123 更新时间:2023-12-01 10:37:16 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com