您的位置:首页 > 其它

排列问题(递归算法)

2007-04-23 20:41 204 查看
问题描述:
设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)构成。

依此递归定义,可设计产生perm(R)的递归算法及测试(驱动)程序(和结果)如下:
————————————————————————————————————————————————
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

template <class T>
void perm(T list[], int k, int m)
{//产生list[k:m]的所有排列
if (k==m)
{//单元素排列
for (int i=0; i<=m; i++)
cout << setw(5) << 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]);
}
}
}

void main()
{
string list[10] = { "x0","x1","x2","x3"};//,"x4","x5","x6","x7","x8","x9"};
perm(list,0,3);
}

// result
x0 x1 x2 x3
x0 x1 x3 x2
x0 x2 x1 x3
x0 x2 x3 x1
x0 x3 x2 x1
x0 x3 x1 x2
x1 x0 x2 x3
x1 x0 x3 x2
x1 x2 x0 x3
x1 x2 x3 x0
x1 x3 x2 x0
x1 x3 x0 x2
x2 x1 x0 x3
x2 x1 x3 x0
x2 x0 x1 x3
x2 x0 x3 x1
x2 x3 x0 x1
x2 x3 x1 x0
x3 x1 x2 x0
x3 x1 x0 x2
x3 x2 x1 x0
x3 x2 x0 x1
x3 x0 x2 x1
x3 x0 x1 x2
Press any key to continue

————————————————————————————————————————————————
算法perm(list,k,m)递归地产生所有前缀是list[0:k-1],且后缀是list[k:m]的全排列的所有排列。函数调用perm(list,0,n-1)则产生list[0:n-1]的全排列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: