题目:求一个数组的子集
-
例子:
给出数组 [a,b,c] 其子集就是 空、a、b、c、ab、ac、bc、abc -
思路
这个问题实际上是一个遍历树的问题,进行遍历每一个子元素,再进入下层函数时候记录上层结果,加入到下层函数中,再存储起来。由于ab和ba是一个元素,所以在a遍历完bc后,b只要遍历c就可以,也就是说进入下层函数时还需要知道目前遍历的是第几个元素,下层函数叠加剩余遍历元素存储。 -
python版本
def recset(li,fli,fst):
changdu = len(li)
if changdu !=0:
for i in range(changdu):
fst2 = fst[:]#用于在迭代函数时恢复fst的初始状态
shengyu = li[i+1:]
temp = fst2+li[i]
fli.append(temp)
recset(shengyu,fli,temp)
li = ['a','b','c']#初始数组
fli = [] #用于收集元素
fst = ''#用于知道上层函数遍历哪个元素
fli.append('')#加上空集
recset(li,fli,fst)
print (fli)
- c语言版本
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int recset(char li[], char* fli[],char fst[],int* f){
int changdu,aa;
for (aa=0;aa<50;aa++){
if(li[aa]=='\0')break;//遇到字符串的尾0停住,得到字符串长度
}
changdu = aa;
if(changdu!=0){
int i;
char fst2[50];//做一个中间变量的复制,保持for循环里fst2没有变化
for(i=0;i<changdu;i++){
int l;
for(l=0;l<50;l++){
fst2[l]=fst[l];//fst数组完全复制给fst2
}
char shengyu[50]="\0";//初始化剩余数组
int j,ww=i;//不能改变i的值
for(ww=ww+1,j=0;ww<=changdu;ww++,j++) {
shengyu[j]=li[ww];
};//求出剩余字符串
int w;
for(w=0;w<50;w++){
if(fst2[w]=='\0')break;//得到fst2的真正长度
}
fst2[w]=li[i];//把正在迭代的字符串数字加到fst2的末尾 如果有0就会覆盖
fst2[w+1]='\0';// 再尾巴加上0
fli[*f]=(char *)malloc(sizeof(fst2));
strcpy(fli[*f],fst2);
*f=*f+1;
recset(shengyu,fli,fst2,f);
}
}
return 0;
}
int main() {
char li[]="abcd";//求abcd的子集
char *fli[50]={0};
char fst[50]={0};
int f;
f = 0;//f是记录次数 fli用来存放50条字符串 fst用来存放上层函数中间变量
recset(li,fli,fst,&f);
int q;
for(q=0;q<50;q++){
printf("%s\n",fli[q]);//打印结果
}
return 0;
}