整体思路
description:
我们先看一个例子
A={a, b ,c ,d}
非空子集有
{a}
|-->{a, b ,c }-->{a, b ,c ,d}
{a, b}-->|
|-->{a, b ,d}
{a, c}-->{a, c ,d}
{a, d}
{b}
{b, c}-->{b ,c ,d}
{b, d}
{c}
{c, d}
{d}
通过上面的例子你是不是发现一个规律,
子集{a}、{b}、{c}、{d}分别是空集与未添加到子集中元素{a, b, c, d}中的某一个组合成。
子集{a, b}、{a, c}、{a, d}分别是子集{a}与未添加到子集中元素{b, c, d}中的某一个组合成。
子集{a, b ,c }和{a, b ,c }分别是子集{a, b}与未添加到子集中元素{c, d}中的某一个组合成。
description:
我们先看一个例子
A={a, b ,c ,d}
非空子集有
{a}
|-->{a, b ,c }-->{a, b ,c ,d}
{a, b}-->|
|-->{a, b ,d}
{a, c}-->{a, c ,d}
{a, d}
{b}
{b, c}-->{b ,c ,d}
{b, d}
{c}
{c, d}
{d}
通过上面的例子你是不是发现一个规律,
子集{a}、{b}、{c}、{d}分别是空集与未添加到子集中元素{a, b, c, d}中的某一个组合成。
子集{a, b}、{a, c}、{a, d}分别是子集{a}与未添加到子集中元素{b, c, d}中的某一个组合成。
子集{a, b ,c }和{a, b ,c }分别是子集{a, b}与未添加到子集中元素{c, d}中的某一个组合成。
子集{a, b ,c ,d}分别是子集{a, b ,c}与未添加到子集中元素{d}中的某一个组合成。
下面是代码
#include <stdio.h>
#include <stdlib.h>
int count = 0; //表示第几个子集
void print(char *str)
{
printf("%d: %s\n", ++count, str);
}
//start表示还未添加到子集中的元素的开始位置
//end表示集合最后一个元素的位置
//在子集中的元素
void sub_list(char *start, char *end, char *str)
{
char *p = start;
int len = strlen(str);
while( p <= end ) //想自己中依次添加未放入子集中的元素,一次一个
{
str[len] = *p; //子集中添加一个未放入子集的元素。
str[len+1] = 0;
print(str);
p++;
sub_list(p, end, str);//递归计算在本子集基础上的产生的子集。
str[len] = 0;
}
}
int main()
{
char sub[] = "abcdef";
char str[255];
memset(str, 0, 255*sizeof(char));
printf(" collent {%s} : \n", sub);
sub_list(sub, &sub[strlen(sub)-1], str );
}