您的位置:首页 > 其它

全排列递归算法

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”这个原始的第一个排列。否则,如果我们不恢复的话,就会出现,虽然数量与正确解法相同,但是会有重复的排列的现象。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: