使用递归函数用来输出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 ...
随机推荐
- SCU 4439 Vertex Cover|最小点覆盖
传送门 Vertex Cover frog has a graph with n vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and m edges (v(a1 ...
- Ado.net总结-Command(指挥官)
Command 概述 在 System.Data.SqlClient 命名空间下,对应的 Command 类为 SqlCommand,在创建 SqlCommand 实例前必须已经创建了与数据库的连接. ...
- Windows系统下批处理快速创建WIFI
为什么要用cmd这种古老的东西创建wifi呢,电脑管家.360安全卫士都有这种插件,一键开启关闭,多方便啊! 开始用的也是电脑管家的免费wifi插件,但是我越来越不能忍它极慢的启动关闭过程,每一次看着 ...
- [Micropython]TPYBoard v202 智能WIFI远控小车
转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言---------------------- 之 ...
- SpringCloud-Hystrix原理
Hystrix官网的原理介绍以及使用介绍非常详细,非常建议看一遍,地址见参考文档部分. 一 Hystrix原理 1 Hystrix能做什么 通过hystrix可以解决雪崩效应问题,它提供了资源隔离.降 ...
- ubuntu pycharm、idea创建快捷方式
编辑/usr/share/application/pycharm.desktop [Desktop Entry] Type=Application Name=Pycharm GenericName=P ...
- dubbo配置文件解读(2)
<dubbo:service/> <dubbo:reference/> <dubbo:protocol/> <dubbo:registry/> < ...
- 一道简单到爆 Java面试题,居然挂了一票人
很多时候bug往往都是出在,我们觉得非常简单,不起眼的基础知识上 年前公司最后一波招人,为年后项目做技术储备,主要招聘对象初中级Java开发,要求也并没有多苛刻,唯一一点基础稍好,快速上手做项目就行. ...
- 一起来学习XPATH,来看看除了正则表达式我们还能怎么抓取数据
参考学习的网站链接http://www.w3school.com.cn/xpath/xpath_intro.asp 首先理清楚一些常识 以此为例 <?xml version="1.0& ...
- JS中字符串切片
1.charAt 作用:根据索引值获取字符串 s1= "Hello world"; // 根据索引求字符 var myChar = s1.charAt(4); console.lo ...