参考博文链接: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++输出全排列递归算法详细解释相关推荐

  1. SPSS多元线性回归输出结果的详细解释

    先说一句题外话,如果当年在大学里数理统计等课程结合SPSS,SAS,R等软件来讲,应该效果会好很多. 最近做了一些用SPSS进行线性回归的实验,还是感觉很多细节把握不好,这里结合我的实验结果,以及网上 ...

  2. linux中useradd的文件路径,linux的useradd命令详细解释

    Linux中的useradd命令顾名思义就是添加用户的命令.下面由学习啦小编为大家整理了Linux的useradd命令的详细解释的相关知识,希望对大家有帮助! linux的useradd命令的详细解释 ...

  3. MapReduce的工作原理,详细解释WordCount程序

    本篇文章主要说两部分:简单介绍MapReduce的工作原理:详细解释WordCount程序. MapReduce的工作原理 在<Hadoop in action>一书中,对MapReduc ...

  4. 运放电路分析_运放参数的详细解释和分析part4运放噪声

    点击上方蓝字   获取更多电子硬件知识 本文主要分析一下运放电路的噪声组成以及计算时应该要注意的地方.另外给出了一些关于运放噪声的参考资料和计算工具.后台回复 下载|004 下载 运放噪声及其计算 运 ...

  5. Python __name__ == ‘__main__’详细解释-Python零基础入门教程

    目录 一.简介 1.__name__ 2.'__main__' 3.__name__ == '__main__' 二.作用 三.猜你喜欢 ​ 零基础 Python 学习路线推荐 : Python 学习 ...

  6. linux查看xml文件的配置,Hibernate配置文件hibernate.cfg.xml的详细解释

    Hibernate配置文件hibernate.cfg.xml的详细解释 [日期:2012-12-13] 来源:Linux社区 作者:jqyp [字体:大 中 小] /p> "-//Hi ...

  7. python模板代码替换_Python - 安全替换字符串模板(safe_substitute) 详细解释

    安全替换字符串模板(safe_substitute) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27057339 字 ...

  8. verilog之状态机详细解释(一)

    一.有限状态机定义 有限状态机(Finite-State Machine,FSM),又成为有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.笔者常在电机控制. ...

  9. 区块如何防篡改_区块链数据不可篡改的详细解释

    区块链数据不可篡改的详细解释 背景介绍 本人新人一枚,学习区块链的过程中,在网上看到了很多讨论区块链区块数据不可篡改的文章,以比特币为例哈,主要存在2种解释: 解释1:由于哈希指针的存在,假设存在某节 ...

  10. ps -aux详细解释

    ps -aux详细解释 ps-aux 显示其他用户启动的进程(a) 查看系统中属于自己的进程(x) 启动这个进程的用户和它启动的时间(u) 使用"date -s"命令来修改系统时间 ...

最新文章

  1. 清华博士接亲被要求现场写代码,5 分钟做出一颗爱心
  2. python2 python3编码_Python2和Python3编码问题-从底层出发
  3. JavaScript强化教程——AJAX
  4. [BUUCTF-pwn]——axb_2019_brop64
  5. 根据需要通过代码的方式加载js文件
  6. @RequestParam的作用
  7. “啁啾”看完这篇再不懂,放弃吧……
  8. wincc怎么做一个弹出画面_wincc怎样弹出确认窗口?
  9. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
  10. [原] 内心深处唱的这首歌
  11. JetBrains AppCode:用于 iOS/macOS 开发的智能 IDE
  12. 算法面试基础:LR(逻辑回归)
  13. php 获取农历,PHP获取农历、阳历转阴历
  14. Python计算机视觉-仿射扭曲简单实例
  15. # MPU6050之2阶低通滤波,滤波效果非常好
  16. 青龙魔改助力,突破45ck上限
  17. HTML+CSS+JS网页设计期末课程大作业 悦世界游戏介绍(7个页面) web前端开发技术 web课程设计 网页规划与设计
  18. android时间选择原生,安卓原生时间选择器
  19. GPU的发展史,GPU与CPU的关系是什么?为何现在GPU越来越重要?
  20. h5盲盒商城源码完整版-附带详细教程

热门文章

  1. Atitit custom popup 弹窗 techweo layers目录Custom div 1Open 2关闭popup 3关闭事件 3Custom div<!-- pw
  2. Atitit vm os内存管理 目录 1. 冯诺依曼结构、哈佛结构、改进型哈佛结构 1 1.1. 冯·诺依曼结构 1 1.2. 哈佛结构 2 1.3. 改进型的哈佛结构与哈佛体系结构差别 3 2.
  3. Atitit 数据存储实现方案总结 提升开发效率 不要一股脑把数据塞到远程关系型数据库,会造成开发效率的降低。。根据不同的要求,选择最简化快速的方案 目录 1. 选择存储原则 2 1.1. 简单快
  4. Atitit Atitit 零食erp数据管理---世界著名零食系列数据.docx世界著名零食
  5. paip.python连接mysql最佳实践o4
  6. 汉字乱码的终极解决方案
  7. 野村综合研究所李智慧:日本金融科技是制度先行而非技术先行
  8. 通力法评 | 资管新规系列一:对公募基金管理公司的影响
  9. (转)如何看待美国监管机构要求文艺复兴基金提交源码?
  10. CTP: 接收心跳超时Bug