【数据结构】递归题目(二)求一个数组的子集

题目:求一个数组的子集

  • 例子:
    给出数组 [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;
}

猜你喜欢

转载自blog.csdn.net/yehuozhili/article/details/82288048