我试图寻找一些算法来查找给定列表的所有子列表,这就是我发现的:
空列表的唯一子列表是空列表。 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)
}
这个函数给出了一个堆栈溢出错误,正如我所期望的那样,但是在该问题的例子中它对他有用。可能是因为我误解了他解释的原则?我怎么能用递归解决这个问题?我的错在哪里?
我在哪里可以找到这样的算法?
答案 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)
}
}