全排列问题
设计一个递归算法生成
n个元素{r1,r2,…,rn}的全排列。
设
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)构成。
代码:
#include "stdio.h"
void swap (int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void perm(int list[],int k,int m)
{
int i;
if(k>m)
{
for(i=0;i<=m;i++)
printf("%4d",list[i]);
printf("/n");
}
else
{
for(i=k;i<=m;i++)
{
swap(&list[i],&list[k]);
perm(list,k+1,m);
swap(&list[i],&list[k]);
}
}
}
main()
{
int list[4];
int i;
for(i=0;i<4;i++)
{
list[i]=i+1;
}
perm(list,0,2);
}
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void perm(int list[],int k,int m)
{
int i;
if(k>m)
{
for(i=0;i<=m;i++)
printf("%4d",list[i]);
printf("/n");
}
else
{
for(i=k;i<=m;i++)
{
swap(&list[i],&list[k]);
perm(list,k+1,m);
swap(&list[i],&list[k]);
}
}
}
main()
{
int list[4];
int i;
for(i=0;i<4;i++)
{
list[i]=i+1;
}
perm(list,0,2);
}