【算法题目】递归题目(二)求一个数组的子集

题目:求一个数组的子集

  • 例子:
    给出数组 [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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值