我正在尝试找到一个好的递归算法来打印出一组的子集 . 例如
大小5:给出 the set {1,2,3,4,5} and the subsets off length 3 gives this output:
{5,4,3}
{5,4,2}
{5,4,1}
{5,3,2}
{5,3,1}
{5,2,1}
{4,3,2}
{4,3,1}
{4,2,1}
{3,2,1}
我尝试了很多东西,但它不起作用 . 在互联网上所有的例子都是集算法,但我想写自己的,用于学习目的 .
有人可以帮我吗?
亲切的问候,
3 回答
最后它有效:
几年前我遇到了一个非常类似的问题 . 我最终实现这个的方式:
1.将每个集存储为成员ID的排序数组(没有2个ID是相同的)
2.用于迭代给定大小的子集N以原始集合的前N个元素开始
3.到达下一个子集,你实现了一种"clockwork"机制 - 取你子集的最后一个(最高id)成员,并用超集中的邻居替换它(下一个更高的id) .
4.如果超集中没有这样的高邻居,则递增子集的下一个较低成员,然后将原始最高成员设置为之后的下一个成员 .
步骤3和4是递归的 .
迭代{1,2,3,4,5}的所有三元组的示例结果序列:
等等
它比mark的提议更复杂,但占用更少的内存和堆栈空间 . 它也是“可重启的” - 这意味着你可以将任何子集传递到算法中,它将为你提供“下一个”子集 .
要构造递归算法,您可以注意到来自{1,2,3,4,5}的每个长度为3的子集:
包含{2,3,4,5}中的元素"1"和2个元素 .
不包含{2,3,4,5}中的元素"1"和3个元素 .
这两种情况中的每一种都可以通过递归调用函数来实现 .