关于求子集 用递归算法
输入任意元素 能得出它的所有子集。
如输入:a 2 zf 得到:{},{a},{2},{zf}{a,2},{a,zf},{2,zf},{a,2,zf}
希望高手们多多指教,小弟感激不尽。
[解决办法]
#include <string.h>
#include <iostream>
using namespace std;
void build(char str[],int n)
{
if(n==0)//控制输出
{
cout < cout < }
else
{
build(str,n-1);
char newstr[5] = { ' '};//去掉就把该位置的元素置成空
strcpy(newstr,str);
newstr[n-1]= ' ';
build(newstr,n-1);
}
}
void main()
{
char string[5]= "abc ";//实例集合放在数组中
build(string,3);
}
[解决办法]
楼主自己先将整个搜索过程表示为搜索树的形式,问题自然就很简单了。
每一个元素对于一个子集来说,只有两中状态:0表示不属于该子集,1表示属于该子集。程序中的数组a就是采用这种表示。因此,搜索过程表示为树的形式就是这样的:
a
0/ \1
b c
0/ \1 0/ \1
...........
因此:
代码中的第一个“trail(t,i+1,n);”就是搜索当前扩展节点的左子树(因为a[i]此时的值为0)。
代码中的“a[i]=1-a[i];”就是变换当前扩展节点的状态,也就是从左子树换到右子树。
代码中的第二个“trail(t,i+1,n);”就是搜索当前扩展节点的右子树。