问题描述
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。集合R中元素的全排列记为perm(R)。(ri)perm(Ri)表示在全排列perm(Ri)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:
当n=1时,perm(R)=(r),其中r是集合R中唯一的元素;
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…,(rn)perm(Rn)构成。
Template <class Type>void perm(Type list[], int k, int m ) //产生[list[k:m]的所有排列{if(k==m) 空{ //只剩下一个元素for (int i=0;i<=m;i++)cout<<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]);}}
#include<iostream>using namespace std;template<class Type>void Print(Type a[]) {for (int i = 0; i < 5; i++)cout << a[i] << " ";cout << endl;}void perim(int a[], int L, int R) {if (L == R) {Print(a);return;}for (int i = L; i < R; i++) {swap(a[i], a[L]);cout << a[1] << endl;perim(a, L + 1, R);swap(a[i],a[L]);cout << a[0] << endl;}}int main(){int a[5]={};for (int i = 0; i < 5; i++)a[i] = rand() % 10 + 1;Print(a);perim(a, 2, 5);}
思考:
对于数组list=(a,b,c,d)
分别写出perm(list,0,3),perm(list,1,3),perm(list,2,3),perm(list,3,3)的结果。
perm(list,0,3) abcd的全排列 24种
perm(list,1,3) 6种
perm(list,2,3) 2种结果
perm(list,3,3) 1种
要了解perm(list,1,3)的过程,有3次调用perm(list,2,3)过程,每次调用perm(list,2,3)有2种结果,所以一共有6种结果。
