如何在 Java 中递归地从 N 元素集中生成所有 k 元素子集
所以我陷入了试图从给定的 N 元素集中找到所有 k 元素子集的问题。我知道使用公式 C(n,k)=C(n-1, k-1)+C(n-1, k) 的 k 子集总数是多少,我也知道如何做到这一点以迭代的方式,但是当我尝试思考递归解决方案时,我陷入了困境。谁能给我提示吗? 谢谢!
So I am stuck with this problem of trying to find all k-elements subsets from a given N-elements set. I know what the total number of k-subsets is using the formula C(n,k)=C(n-1, k-1)+C(n-1, k) and I also have an idea how to do it in a iterative manner, but I get stuck when I try to think of a recursive solution. Can anyone give me a hint?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对于集合中的每个元素,取出该元素,然后依次添加剩余 N-1 元素集合的所有 (k-1) 个子集。
“那是一个漆黑的暴风雨之夜,船长说……”
For each element of the set, take that element, then add in turn to that all (k-1) subsets of the remaining N-1 element set.
"It was a dark and stormy night, and the Captain said ..."
更好
对于
k=0
情况,这是错误的,因为我认为它会返回一个包含空集的集合,这不太正确。反正。这里还有一个迭代,如果目标是纯粹递归的话,您可能可以用递归替换它。这是对 wikipedia: powerset 中给出的算法的相当简单的修改。我将把解决极端情况 (k=0) 的问题留给读者。这不是正确的尾递归,但在大多数 JVM 中这并不重要。 (我猜 IBM JVM 会这样做...)
仅限 Power Set
这可能还没有完全实现,也不是很优雅,但它递归地计算完整的幂集,然后(迭代地)修剪它的大小。
Better
This is broken for the
k=0
case, because I think it'll return a set containing the empty set, which isn't quite right. Anyway. There's also an iteration in here, you could probably replace that with recursion if the goal is being PURELY recursive. This is a fairly straightforward modification of the algorithm given at wikipedia: powerset. I'll leave fixing the corner cases (k=0) to the reader.This is not properly tail-recursive, not that it matters in most JVMs. (I guess the IBM JVM does this...)
Power Set Only
This doesn't probably quite get there, and isn't really elegant, but it computes the full powerset recursively, then trims it (iteratively) for size.
这是一些伪代码。您可以通过在调用时存储每个调用的值以及在递归调用之前检查调用值是否已存在来减少相同的递归调用。
以下算法将具有除空集之外的所有子集。
Here's some pseudocode. You can cut same recursive calls by storing the values for each call as you go and before recursive call checking if the call value is already present.
The following algorithm will have all the subsets excluding the empty set.