【问题标题】:Sublists of lists using recursion in scala在scala中使用递归的列表子列表
【发布时间】:2014-07-31 17:27:54
【问题描述】:

我试图寻找一些算法来查找给定列表的所有子列表,这就是我发现的:

空列表的唯一子列表是空列表。 x:xs 的子列表(即头部 x 和尾部 xs 的列表)是 xs 的所有子列表以及 xs 的每个带有 x 前缀的子列表。

取自Sublists of a list using list comprehension

这是我实现的:

    def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match{
    case List() => List()
    case x::xs => combinations(xs) ::: combinations(x :: xs)

  }

正如我所料,这个函数给出了一个堆栈溢出错误,但是在那个问题的例子中它对他有用。可能是我误解了他解释的原理?我如何使用递归来解决这样的问题?我的错误在哪里?

我在哪里可以找到这样的算法?

【问题讨论】:

  • 在 ::: 之后有无限递归
  • @Daenyth 是的。那是正确的。检查Kigyo的答案。我现在可以看到这个算法,它在我的案例中失败了。你知道更好的算法吗?

标签: algorithm list scala recursion stack-overflow


【解决方案1】:

这将是根据您所述定义的算法。

对于空列表,返回一个带有空列表的列表。

对于另一种情况,使用递归从tail 中获取所有组合,然后将head 与结果中的每个元素(tailComb) 组合起来。 (tailComb.map(sub => x :: sub))。

def combinations[A](list: List[A]): List[List[A]] = list match {
  case Nil => List(List.empty[A])
  case x::xs => {
    val tailComb = combinations(xs)
    tailComb ::: tailComb.map(sub => x :: sub)
  }
}

【讨论】:

  • 看起来算法在我的情况下不起作用,如果这是它所转换的。你会推荐我什么更好的算法? (我不想要代码。如果你能告诉我,我只想要一个算法的名称或一个链接)
  • 为什么不起作用?这是你给我的定义。当你不告诉我你想要什么时,我能推荐什么?举个例子。
  • 在 scala 中使用递归作为标题状态的列表的子列表。如果您需要更多说明:[1,2,3] = [1,2],[1],[2],[3],[2,3] 等等
  • combinations([1,2,3]) 给出 [[], [1], [2], [3], [1,2], [1,3], [2, 3],[1,2,3]]。这不是你想要的吗?
  • 嗯。我的错。我的测试基于一个List[(Char,Int)],它确实编译了它,但没有显示所有结果。我的问题不是这样,所以我会将其标记为已接受
猜你喜欢
  • 2016-04-30
  • 2011-09-17
  • 2013-10-25
  • 2021-12-13
  • 2022-01-07
  • 2020-01-21
  • 1970-01-01
  • 2020-07-20
  • 2016-05-14
相关资源
最近更新 更多