使用递归函数用来输出n个元素的所有子集(数据结构、算法与应用)
例如,三个元素的集合A = {a,b,c}的所有子集是:空集a,b,c,ab,ac,bc,abc,共八个
分析:
对于集合A中的每个元素,在其子集中都可能存在或者不存在,所以A的子集有23种。
可以设置一个变量IsExist,用来表示集合A中的某个元素是否存在于子集中,如果IsExist = 1,则表示存在,如果IsExist = 0,则表示不存在
更近一步,可以想到设置一个数组IsExist[3],将数组IsExist与数组A中相同下标的元素绑定在一起。
例如如果IsExist = {0,0,0},则A对应的子集为空集
如果IsExist = {1,1,1},则A对应的子集为全集
所以我们表面上是在求一个子集问题,实际上是在求一个关于IsExist的全排列问题,如图

完全就是高中知识吧,现在的问题就变成了怎样求出这8个排列,肯定是用一个递归函数来求的
也很容易想到,这个函数至少需要两个参数
void Func(int Arr(),int Index){}
Arr()是用来记录排列结果的,Index用来记录当前处理的数组元素的下标
我们先从下标为0的元素开始处理,Arr(0)有两种情况,分别为0和1,两种情况下又对应着下标为1的情况,接着又对应着下标为2的情况,此时递归就结束了,即递归的终点标志是当Index等于Arr()的末尾元素的下标时,故我们联想到此函数还需要一个参数用来记录Arr()的长度,我们命名为Len,所以递归函数的完整代码是:
void Func(int Arr[], int Index, int Len)
{
if (Index == Len)
{
for (int i = ; i < Len; i++)
{
cout << Arr[i];
}
cout << endl;
}
else
{
Arr[Index] = ;
Func(Arr, Index + , Len);
Arr[Index] = ;
Func(Arr, Index + , Len);
}
}
主函数为
int main()
{
int a[];
Func(a, , );
system("pause");
}
写这个主函数主要是举个例子方便大家理解一下函数中参数的具体意义
在这个基础上写出集合的子集就很简单了,在函数里多加一个参数就行,具体代码如下:
#include<iostream>
using namespace std;
//n个元素的所有子集(递归函数)
template <typename T>
void Func(T Group[],int Arr[], int Index, int Len)
{
if (Index == Len)
{
cout << "{";
for (int i = ; i < Len; i++)
{
if (Arr[i] == )
{
cout << Group[i];
}
}
cout << "}" << endl;
}
else
{
Arr[Index] = ;
Func(Group,Arr, Index + , Len);
Arr[Index] = ;
Func(Group,Arr, Index + , Len);
}
} int main()
{
char group[] = { 'a', 'b', 'c' };
int a[];
Func(group,a, , );
system("pause");
}
使用递归函数用来输出n个元素的所有子集(数据结构、算法与应用)的更多相关文章
- 使用递归函数,输出n个元素的所有子集
题目描述: 请编写一个递归函数,用来输出n个元素的所有子集.例如,三个元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}. 解题思路: 根据 ...
- 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素
//求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素 #include <stdio.h> #include <string.h> int find_mi ...
- C++递归求解N个元素的所有子集
C++递归求解N个元素的所有子集 引言: 我在复习C++遇到了设计递归函数的问题.这个例子,很好的显示了设计递归的方式,思想. 这与斐波那数列不同,这个例子更有应用意义. 问题: 试编写一个递归函数, ...
- SDUT OJ 顺序表应用3:元素位置互换之移位算法
顺序表应用3:元素位置互换之移位算法 Time Limit: 1000 ms Memory Limit: 570 KiB Submit Statistic Discuss Problem Descri ...
- SDUT OJ 顺序表应用2:多余元素删除之建表算法
顺序表应用2:多余元素删除之建表算法 Time Limit: 3 ms Memory Limit: 600 KiB Submit Statistic Discuss Problem Descripti ...
- 《Algorithms算法》笔记:元素排序(3)——洗牌算法
<Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...
- 递归函数练习:输出菲波拉契(Fibonacci)数列的前N项数据
/*====================================================================== 著名的菲波拉契(Fibonacci)数列,其第一项为0 ...
- python(序列递归)【输出原子级别元素。。。】
晚上回去复习下原来的资料,返现Codebook中有个关于“展开一个嵌套序列”的话题. 任务说明:序列中的子项可能是序列,子序列的子项仍可能是序列,以此类推,则序列嵌套可以达到任意的深度.需要循环遍历一 ...
- 编写3个不同版本的程序,令其均能输出ia的元素
#include<iostream> #include<vector> #include<string> using namespace std; int main ...
随机推荐
- Go Web 编程之 请求
概述 前面我们学习了处理器和处理器函数,如何编写和注册处理器.本文我们将学习如何从请求中获取信息. 请求的结构 通过前面的学习,我们知道处理器函数需要符合下面的签名: func (w http.Res ...
- DFS——深度优先搜索的一般格式
DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从 ...
- 树上对抗搜索 - 树形dp
Alice and Bob are going on a trip. Alice is a lazy girl who wants to minimize the total travelling d ...
- 使用vscode运行python出现中文乱码的解决方法
前提:自己安装了code runner的插件 快捷键Ctrl+Shift+P,打开设置Open Settings (JSON):
- python类型-集合
集合对象是一组无序排列的可哈希的值,集合成员可以做字典的键.集合有两种类型:可变集合,可以添加和删除元素,可变集合不是可哈希的,不能用作字典的键也不能作为其它集合中的元素:不可变集合相反,有哈希值,可 ...
- [CCPC2019 ONLINE]H Fishing Master
题意 http://acm.hdu.edu.cn/showproblem.php?pid=6709 思考 先考虑所有鱼的烹饪时间小于k的情况.将T从大到小排序后,煮一条鱼相当于将其时间补齐至k. 由于 ...
- HTTP负责均衡模块(HTTP Upstream)
这个模块为后端的服务器提供简单的负载均衡(轮询(round-robin)和连接IP(client IP))如下例: upstream backend { server backend1.examp ...
- CountDownLatch CyclicBarrier和 Semaphore
CountDownLatch CyclicBarrier和 Semaphore 原理 基于AQS实现. 让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果 ...
- 【Kafka 源码解读】之 【代码没报错但是消息却发送失败!】
聊聊最近,2020年,在2019年的年尾时,大家可谓对这年充满新希望,特别是有20200202这一天.可是澳洲长达几个月的大火,新型冠状病毒nCoV的发现,科比的去世等等事情,让大家感到相当的无奈,生 ...
- Oracle数据库、实例、用户、表空间、表之间的关系
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...