使用递归函数,输出n个元素的所有子集
题目描述:
请编写一个递归函数,用来输出n个元素的所有子集。例如,三个元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.
解题思路:
根据子集的定义,集合中的每一个元素在子集中都有两种状态:‘1’表示出现,'0'表示不出现;如果所有的元素都不出现,则该子集是空集,如果所有的元素都出现,则该子集是全集。
我们定义一个标记数组tag,用于记录集合中对应的元素是否出现,每层遍历对应集合中的每个元素,都有出现(为‘1’)和不出现(为‘0’)两种可能,一直遍历到所有的元素的可能都标记完,然后根据数组函数输出结果。
程序代码:
#include <iostream>
using namespace std;
void build(char *str,int *tag,int n)
{
if(n==5)
{
cout<<"{";
for(int i=0;i<5;i++)
if(tag[i]==1)
cout<<str[i];
cout<<"}"<<endl;
return;
}
tag[n] = 0;
build(str,tag,n+1);
tag[n] = 1;
build(str,tag,n+1);
}
int main()
{
char a[5]={'a','b','c','d','e'};
int tag[5];
build(a,tag,0);
return 0;
}
输出结果:
{}
{e}
{d}
{de}
{c}
{ce}
{cd}
{cde}
{b}
{be}
{bd}
{bde}
{bc}
{bce}
{bcd}
{bcde}
{a}
{ae}
{ad}
{ade}
{ac}
{ace}
{acd}
{acde}
{ab}
{abe}
{abd}
{abde}
{abc}
{abce}
{abcd}
{abcde}
一共有2^5 = 32个子集。
这是《数据结构与算法应用》中的一道课后题,看了作者的标准答案:http://www.mhhe.com/engcs/compsci/sahni/c1/E5.HTM
发现和我的思路是一样的,哈哈,英雄所见略同~
使用递归函数,输出n个元素的所有子集的更多相关文章
- 使用递归函数用来输出n个元素的所有子集(数据结构、算法与应用)
例如,三个元素的集合A = {a,b,c}的所有子集是:空集a,b,c,ab,ac,bc,abc,共八个 分析: 对于集合A中的每个元素,在其子集中都可能存在或者不存在,所以A的子集有23种. 可以设 ...
- 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素
//求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素 #include <stdio.h> #include <string.h> int find_mi ...
- C++递归求解N个元素的所有子集
C++递归求解N个元素的所有子集 引言: 我在复习C++遇到了设计递归函数的问题.这个例子,很好的显示了设计递归的方式,思想. 这与斐波那数列不同,这个例子更有应用意义. 问题: 试编写一个递归函数, ...
- python利用递归函数输出嵌套列表的每个元素
1.先用 for 循环取. for item in l: if isinstance(item ,list): for newitem in item: print(newitem) else: pr ...
- python(序列递归)【输出原子级别元素。。。】
晚上回去复习下原来的资料,返现Codebook中有个关于“展开一个嵌套序列”的话题. 任务说明:序列中的子项可能是序列,子序列的子项仍可能是序列,以此类推,则序列嵌套可以达到任意的深度.需要循环遍历一 ...
- 编写3个不同版本的程序,令其均能输出ia的元素
#include<iostream> #include<vector> #include<string> using namespace std; int main ...
- python 输出所有列表元素的乘积
def multiply_list(items): tot = 1 for x in items: tot *= x return tot print(multiply_list([1,2,-8]))
- PHP 循环输出多重数组元素
<?php $arr = array( array( array( array( array( ,, ) ) ), array( ,,) ) ), array(, , ) ); function ...
- c++算法应用 预备
章 C + +程序设计 大家好!现在我们将要开始一个穿越" 数据结构.算法和程序" 这个抽象世界的特殊旅程,以解决现实生活中的许多难题.在程序开发过程中通常需要做到如下两点:一是高 ...
随机推荐
- ArcGIS Runtime SDK for WPF之测量距离和面积
bu不多说,上代码 using System.Windows; using ESRI.ArcGIS.Client; using ESRI.ArcGIS.Client.Tasks; using ESRI ...
- SCARA——OpenGL入门学习三
OpenGL入门学习[三] 在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处.例如:点太小,难以看清楚:直线也太细,不舒服:或者想画虚线,但不知道方法只能用 ...
- niosii dma实验中的一点感想
1,使用nios给出的驱动函数的顺序一般为1,清中断2,写控制寄存器,3,写参数寄存器4,中断注册,5,开始工作.因为开始工作控制位在控制寄存器中,所以会想到到最后一块写,省事,但是在dma试验中发现 ...
- python 的os的总结
转:http://www.cnblogs.com/BeginMan/p/3327291.html
- iis部署网页时应该避免的特殊端口
1 tcpmux 7 echo 9 discard 11 systat 13 daytime 15 netstat 17 qotd 19 chargen 20 ftp data 21 ftp cont ...
- INSTALL_FAILED_SHARED_USER_INCOMPATIBLE的问题
eclipse编译出来的apk,安装时报出INSTALL_FAILED_SHARED_USER_INCOMPATIBLE的错误. 原因:apk的AndroidManifest.xml中声明了andro ...
- mysql链接出现10060
http://www.cnblogs.com/meetrice/p/5309666.html 使用navicate链接 http://www.cnblogs.com/cxint/p/7454054.h ...
- java数字游戏基础篇
题目: 1.100以内,程序先产生一个随机数,然后用户从控制台输入数字,猜是大了还是小了,第7次时 输出 “您太笨了,答案是”+x 思路:1.随机数,所以用到random 2.用户从键盘输入 ,则用到 ...
- 记录一下学习Android的小知识
目前要设计即时通讯的整体架构,包括服务端.Android.IOS.PC.平板等等系统,所以需要研究一下手机的实现方式,开始从Android入手,偶尔在这记录下小知识. ADT: 1.页面功能请求结构, ...
- UseSubmitBehavior="false" 防止页面重复提交bug
OnClientClick="this.disabled=true;" UseSubmitBehavior="false" 注: 1.当设置UseSubmitB ...