全排列递归算法
2015-12-29 20:24
513 查看
设计一个递归算法生成n个元素的全排列。
算法思想:递归算法的思路比较接近于我们现实生活中的思路。
1.试想,我们只有两个数字:12.要对它进行全排列,第一种方式就是12本身,第二种,将12交换,变为21即可。这提示了我们一种交换的思路。
2.但这概括的并不全面。试想,我们要对123进行全排列。我们可以采用将1固定,“23”进行全排列,将“2”固定,对“13”进行全排列。将“3”固定,对“12”进行全排列。
这其实就是首部为”1“,然后是“2”,然后是“3”,不就是第二位后边的数依次和第一位进行交换么?这是典型的递归的思路。
3.但是,这样也不全面,我们每次交换要将排列恢复成为原始的“123”,因为这个算法求排列的时候,前后并没有依赖性,其参考物只有“123”这个原始的第一个排列。否则,如果我们不恢复的话,就会出现,虽然数量与正确解法相同,但是会有重复的排列的现象。
算法思想:递归算法的思路比较接近于我们现实生活中的思路。
1.试想,我们只有两个数字:12.要对它进行全排列,第一种方式就是12本身,第二种,将12交换,变为21即可。这提示了我们一种交换的思路。
2.但这概括的并不全面。试想,我们要对123进行全排列。我们可以采用将1固定,“23”进行全排列,将“2”固定,对“13”进行全排列。将“3”固定,对“12”进行全排列。
这其实就是首部为”1“,然后是“2”,然后是“3”,不就是第二位后边的数依次和第一位进行交换么?这是典型的递归的思路。
3.但是,这样也不全面,我们每次交换要将排列恢复成为原始的“123”,因为这个算法求排列的时候,前后并没有依赖性,其参考物只有“123”这个原始的第一个排列。否则,如果我们不恢复的话,就会出现,虽然数量与正确解法相同,但是会有重复的排列的现象。
#include<iostream> using namespace std; int count = 0; void perm(int* buf, int start, int end, int num) { if(start >= end) { for(int i = 0; i < num; i ++) cout<<buf[i]; cout<<endl; count ++; } else { for(int i = start; i <= end; i ++) { swap(buf[start], buf[i]); perm(buf, start+1, end, num); swap(buf[start], buf[i]);//PS: 恢复原样 } } } int main() { int num;//全排列的长度 cout<<"Number:"<<endl; cin>>num; int * buf = new int[num];//动态生成全排列的数组 //初始化 for (int i = 0; i < num; i ++) { buf[i] = i+1; } perm(buf, 0, num-1, num); cout<<"Count = "<< count; return 0; }
相关文章推荐
- bzoj3144: [Hnoi2013]切糕
- java中String的特点,字面对象和构造方法的区别
- 从贝叶斯公式到 MAP(Maximum A Posterior,最大后验)
- 简述handler实现异步操作
- LeeCode_MultiplyStrings
- Unity3d热更新(一):更新思路
- 【bzoj1500】[NOI2005]维修数列 Splay
- android动画xml
- protocol buffer 字段过滤
- MariaDB 通过命令行的方式导出指定数据库和还原指定数据库
- 微信公众号开发之创建自定义菜单
- Objective-c语言_计算机网络(UI)同步get,post和异步get,post
- pig JOIN 的replicated后标
- 《UNIX网络编程》TCP网络编程基础(2)
- FireWorks based on NeHe Particle System
- 周日随便看看
- 【转】模板类的声明与实现必须同时放在头文件中
- spring配置文件头文件的说明
- pdf-2-eps
- windows下用sendmail配置php的mail函数