全排列(Perm)的递归实现算法
来源:互联网 发布:微信直接打开淘宝 编辑:程序博客网 时间:2024/05/01 04:25
【什么是全排列】
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。用123来示例下,123的全排列有123、132、213、231、312、321这六种。
【题目】
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
【算法讲解】
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。
集合X中元素的全排列记为perm(X)。
(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。
R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。
实现思想:将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
【示例】
当n=3,并且E={a,b,c},则:
perm(E)=a.perm({b,c}) + b.perm({a,c}) + c.perm({a,b})
perm({b,c})=b.perm(c) + c.perm(b)
a.perm({b,c})=ab.perm(c) + ac.perm(b)=ab.c + ac.b=(abc, acb)
【递归实现】
123的全排列有123、132、213、231、312、321这六种。首先考虑123、213和321这三个数是如何得出的,是1与自身、2、3交换得到的;然后考虑123与132、213与231、312与321是如何得出的,即时第一个数字不变,第二个数和每三个数交换得到。找到这个规律后,递归的代码就很容易写出来了。
【c++代码实现】
#include<iostream>#include<algorithm>using namespace std;template<class Type>void Perm(Type list[], int k, int m){ //产生[list[k:m]的所有排列if (k == m){ //只剩下一个元素 for (int i = 0; i <= m; i++)cout << list[i]; cout << endl;}else //还有多个元素待排列,递归产生排列 for (int i = k; i <= m; i++) {swap(list[k], list[i]);Perm(list, k + 1, m);swap(list[k], list[i]); }}int main(){char s[] = "abcd";Perm(s, 0, 3);system("pause");return 0;}
- 全排列(Perm)的递归实现算法
- 全排列算法之Perm递归算法实现
- 递归实现的全排列算法
- 全排列算法的非递归实现
- 全排列递归算法的实现
- 使用递归实现全排列的算法
- 全排列算法的递归实现
- 全排列的递归实现算法
- 实现全排列的递归算法
- 全排列算法递归实现(可重集)
- 全排列算法递归实现(Permutations)
- 【C++】Perm递归全排列函数分析
- 递归算法实现全排列
- 全排列算法递归实现
- 【算法】递归实现全排列
- 全排列--递归算法实现
- 递归算法实现全排列
- 递归算法实现全排列
- SpringMVC Shiro 上传文件时,获取的是ShiroHttpServletRequest,如何转换成MultipartHttpServletRequest
- LINUX netlink机制
- JavaScript中的坑---parseInt("08")和返回0
- iText 解决中文问字体问题 显示中文
- Linux 学习笔记(三) -----根目录下的一级目录说明
- 全排列(Perm)的递归实现算法
- 母牛的故事
- JAVA 对象引用,以及对象赋值
- 什么上下文
- Unity3D之高级渲染-Shader Forge增强版
- VS2013下安装配置Qt组件环境
- win8安装RobotFramework
- 【剑指offer】最小的k个数
- 关于runtime的使用心得