排列问题(递归算法)

 问题描述:
设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]的全排列。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值