在scala中使用递归的列表的子列表

时间:2014-06-10 19:47:11

标签: algorithm list scala recursion stack-overflow

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

  

空列表的唯一子列表是空列表。 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)

  }

这个函数给出了一个堆栈溢出错误,正如我所期望的那样,但是在该问题的例子中它对他有用。可能是因为我误解了他解释的原则?我怎么能用递归解决这个问题?我的错在哪里?

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

1 个答案:

答案 0 :(得分:3)

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

对于空List,返回一个列表为空的List。

对于另一种情况,使用递归来获取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)
  }
}