C++输出全排列递归算法详细解释
参考博文链接:https://blog.csdn.net/a358463121/article/details/45543879
运用了图的遍历算法:DFS深度优先遍历
中心思想:
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}.
Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。
(1)当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素;
(2)当n>1时,Perm(R)可由(r1)+Perm(R1),(r2)+Perm(R2),…,(rn)+Perm(Rn)构成。
那么具体程序要怎么实现呢?我们来个实际的例子,假设有一数列1,2,3,4
那么1,2,3,4的全排列
perm({1,2,3,4})=1perm({2,3,4})+2perm({1,3,4})+3perm({1,2,4})+4perm(1,2,3)
那么我们只要将每个数,与第一个数交换不就可以得到下一个序列了吗?
比如{1,2,3,4}第一个与第二个数交换,那么不就得到2 {1,3,4}了,接下来我们用一个实际的例子说明该程序是怎样运行的
具体算法流程:
数列:{1,2,3} 第一个与第一个交换
可以得到1 {2,3} 将序列{2,3}放进perm函数递归,然后
——递归{2,3}
数列{2,3}第一个与第一个交换
得到2{3} ,输出1,2,3 (此时low=high,因为序列{3}只有一位数,因此输出列表list)
数列{2,3}第一个与第一个交换回来,结果仍然是{2,3}
数列{2,3}第一个与第二个交换
得到3{2},输出1,3,2
{3,2}又第一个与第二个交换回来,变回{2,3}
—–{2,3}递归完毕序列恢复原状{1,2,3}
数列:{1,2,3} 第一个与第二个交换
可以得到2,{1,3}
——递归{1,3}
数列{1,3}第一个与第一个交换
得到1{3} ,输出2,1,3
数列{1,3}第一个与第一个交换回来,结果仍然是{1,3}
数列{1,3}第一个与第二个交换
得到3{1},输出2,3,1
{3,1}又第一个与第二个交换回来,变回{1,3}
—–{1,3}递归完毕
序列{2,1,3}第一个与第二个交换
序列恢复原状{1,2,3}
数列:{1,2,3} 第一个与第三个交换
可以得到3,{1,2}
——递归{1,2}
数列{1,2}第一个与第一个交换
得到1{2} ,输出3,1,2
数列{1,2}第一个与第一个交换回来,结果仍然是{1,2}
数列{1,2}第一个与第二个交换
得到2{1},输出3,2,1
{2,1}又第一个与第二个交换回来,变回{1,2}
—–{1,2}递归完毕
序列{3,1,2}第一个与第二个交换
序列恢复原状{1,2,3}
算法可以简单地写作
perm({1,2,3})=1perm({2,3})+2perm({1,3})+3perm({1,2})
perm({2,3})=2perm({3})+3perm({2})
perm({1,3})=1perm({3})+3perm({1})
perm({1,2})=1perm({2})+2perm({1})
c++代码:
#include <iostream>
using namespace std;
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void perm(int list[],int low,int high){
if(low==high){ //当low==high时,此时list就是其中一个排列,输出list
for(int i=0;i<=low;i++)
cout<<list[i];
cout<<endl;
}else{
for(int i=low;i<=high;i++){//每个元素与第一个元素交换
swap(list[i],list[low]);
perm(list,low+1,high); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i],list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
int main()
{
int list[]={1,2,3};
perm(list,0,2);
return 0;
}
程序结果:
123
132
213
231
321
312
C++输出全排列递归算法详细解释相关推荐
- SPSS多元线性回归输出结果的详细解释
先说一句题外话,如果当年在大学里数理统计等课程结合SPSS,SAS,R等软件来讲,应该效果会好很多. 最近做了一些用SPSS进行线性回归的实验,还是感觉很多细节把握不好,这里结合我的实验结果,以及网上 ...
- linux中useradd的文件路径,linux的useradd命令详细解释
Linux中的useradd命令顾名思义就是添加用户的命令.下面由学习啦小编为大家整理了Linux的useradd命令的详细解释的相关知识,希望对大家有帮助! linux的useradd命令的详细解释 ...
- MapReduce的工作原理,详细解释WordCount程序
本篇文章主要说两部分:简单介绍MapReduce的工作原理:详细解释WordCount程序. MapReduce的工作原理 在<Hadoop in action>一书中,对MapReduc ...
- 运放电路分析_运放参数的详细解释和分析part4运放噪声
点击上方蓝字 获取更多电子硬件知识 本文主要分析一下运放电路的噪声组成以及计算时应该要注意的地方.另外给出了一些关于运放噪声的参考资料和计算工具.后台回复 下载|004 下载 运放噪声及其计算 运 ...
- Python __name__ == ‘__main__’详细解释-Python零基础入门教程
目录 一.简介 1.__name__ 2.'__main__' 3.__name__ == '__main__' 二.作用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习 ...
- linux查看xml文件的配置,Hibernate配置文件hibernate.cfg.xml的详细解释
Hibernate配置文件hibernate.cfg.xml的详细解释 [日期:2012-12-13] 来源:Linux社区 作者:jqyp [字体:大 中 小] /p> "-//Hi ...
- python模板代码替换_Python - 安全替换字符串模板(safe_substitute) 详细解释
安全替换字符串模板(safe_substitute) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27057339 字 ...
- verilog之状态机详细解释(一)
一.有限状态机定义 有限状态机(Finite-State Machine,FSM),又成为有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.笔者常在电机控制. ...
- 区块如何防篡改_区块链数据不可篡改的详细解释
区块链数据不可篡改的详细解释 背景介绍 本人新人一枚,学习区块链的过程中,在网上看到了很多讨论区块链区块数据不可篡改的文章,以比特币为例哈,主要存在2种解释: 解释1:由于哈希指针的存在,假设存在某节 ...
- ps -aux详细解释
ps -aux详细解释 ps-aux 显示其他用户启动的进程(a) 查看系统中属于自己的进程(x) 启动这个进程的用户和它启动的时间(u) 使用"date -s"命令来修改系统时间 ...
最新文章
- Ajax 完整教程 (转)
- POJ3133(插头dp)
- percona innobackupex 使用
- C/Cpp / STL / map 和 set 的不同点和相同点。
- python-字符串·文件·集合操作
- pixel和毫米怎么换算_压力传感器相关压力单位换算
- java学习(2):学生管理系统2
- zookeeper基本操作
- win7怎么设置开机密码_win7系统设置电脑密码的方法
- s7-300 400plc应用技术_西门子S7300/400顺序功能图设计教程,看完豁然开朗!
- 让VMware ESXi 5.5与Windows时间服务器同步
- android控件布局
- 使用Scikit Learn的分类器探索Iris数据集
- 代码审计——你是如何发现那些有缺陷的代码的
- Linux内存管理专题
- 大学生计算机科学项目,计算机科学与技术学大学生科技创新基金项目申报书.doc...
- Docker-核心篇(1)-CentOS7安装Docker社区版
- 使用中文分词工具切分ArcGIS在线文档
- 【渝粤题库】国家开放大学2021春2408中国当代文学题目
- 未来计算机网络会发展成什么样子,计算机网络技术未来的发展与应用
热门文章
- unity把场景和动画生成xml
- Atitit 2016 技术趋势与没落技术 目录 1.1. 离线优先Web应用程序(Offline first web applications)	1 1.2. 依照产品而不是项目(product
- Atiitt cdn技术总结 性能提升之道 目录 1. 组成 最简单的CDN网络由一个DNS服务器和几台缓存服务器组成:	1 1.1. CDN是一个经策略性部署的整体系统,包括分布式存储、负载均衡
- Atitit sql之道 艾龙著 attilax 1. Ddl dml	3 2. Crud	3 3. 高级sql	3 3.1. Merge	3 3.2. 数据库翻页 limit offset系列
- Atitit hibernate3 hinernate4 hibernate5新特性attilax总结
- Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27
- paip.汉字简化大法总结
- paip.没有源码的情况下更改ASP.net ASPX页
- eclipse插件开发的打包
- Toml :设置策略配置文件