首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于求子集 用递归算法解决办法

2012-03-02 
关于求子集 用递归算法输入任意元素能得出它的所有子集。如输入:a2zf得到:{},{a},{2},{zf}{a,2},{a,zf},{2,

关于求子集 用递归算法
输入任意元素   能得出它的所有子集。
如输入: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);”就是搜索当前扩展节点的右子树。

热点排行