全排列递归算法

来源:互联网 发布:js disabled 失效 编辑:程序博客网 时间:2024/05/20 18:45

 设计一个递归算法生成n个元素的全排列。

算法思想:递归算法的思路比较接近于我们现实生活中的思路。

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;}


1 0
原创粉丝点击