C++递归实现全排列
2015-10-18 19:31
423 查看
实现全排列是递归的一个初级应用,主要思想就是,通过每次遍历输出一个结果。
下面的函数实现的效果就是输入一组字符,输出以‘,’分隔的全排列,最多10个,如果有空格或换行,则提前结束。
例如,如果输入是abc,则过程是这样的:
k=0 m=3 i=k=0 a与a交换,对{b,c}进行全排列
k=1 m=3 i=k=1 b与b交换,对{c}进行全排列
k=2 m=3 满足k == m-1 输出 a,b,c
k=1 m=3 i++ i=2 b与c交换,对{b}进行全排列
k=2 m=3 满足k == m-1 输出 a,c,b
k=0 m=3 i++ i=1 a与b交换,对{a,c}进行全排列
k=1 m=3 i=k=1 a与a交换,对{c}进行全排列
k=2 m=3 满足k == m-1 输出 b,a,c
k=1 m=3 i++ i=2 a与c交换,对{a}进行全排列
k=2 m=3 满足k == m-1 输出 b,c,a
以此类推,就可以得到{a,b,c}的全排列了
下面的函数实现的效果就是输入一组字符,输出以‘,’分隔的全排列,最多10个,如果有空格或换行,则提前结束。
//Permutation.cpp 通过递归实现全排列 #include<iostream> using std::cout; using std::cin; using std::endl; const int MAX = 10; template<class T> void Swap(T& a, T& b)//交换函数 { T temp = a; a = b; b = temp; } template<class T> void Perm(T list[], int k, int m)//生成list[k:m]的全排列 {//list是要递归的数组,k是递归的层数,m是递归的终点 int i = 0;//i表示要用于和元素k互相交换的元素下标 if(k == m-1) { for(i = 0; i<m-1; i++) cout << list[i] << ','; cout << list[i] << endl; } else { for(i = k; i<m; i++) { Swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]); } } } int main() { char ch[MAX]; int i = 0; while(i<MAX){ cin.get(ch[i]); if(ch[i] == ' ' || ch[i] == '\n') break; i++; } Perm(ch,0,i); }
例如,如果输入是abc,则过程是这样的:
k=0 m=3 i=k=0 a与a交换,对{b,c}进行全排列
k=1 m=3 i=k=1 b与b交换,对{c}进行全排列
k=2 m=3 满足k == m-1 输出 a,b,c
k=1 m=3 i++ i=2 b与c交换,对{b}进行全排列
k=2 m=3 满足k == m-1 输出 a,c,b
k=0 m=3 i++ i=1 a与b交换,对{a,c}进行全排列
k=1 m=3 i=k=1 a与a交换,对{c}进行全排列
k=2 m=3 满足k == m-1 输出 b,a,c
k=1 m=3 i++ i=2 a与c交换,对{a}进行全排列
k=2 m=3 满足k == m-1 输出 b,c,a
以此类推,就可以得到{a,b,c}的全排列了
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C++联合体转换成C#结构的实现方法
- C#中的尾递归与Continuation详解
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例