概念
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。公式:全排列数f(n)=n!(定义0!=1)
以下是一全排列C的实现
swap函数是交换,这个酒不说了,perm函数是全排列的实现算法,在perm这个函数当中,最重要的就是递归的实现和数字的调换,比如123,当把1和2掉换了之后,本来下一次要调换1和3的,由于第一次调换,就会变成2和3调换,所以,没调换一次,都要把调换的数字换回来。每一次递归就会固定一个数,for循环是实现开头数字的改变的。当固定第一个数字后,就是求后面数字的全排列
以下是C语言代码的实现
//交换
void swap(int &a,int &b){
int t;
t=a;
a=b;
b=t;
}
//全排列算法,list存放排列的数,k 表示层代表第几个数,m表示数组的长度
void perm(int list[],int l,int m){
int i;
if(l==m){
for( i=0 ; i<=m ; i++ ){
printf("%d ",list[i]);
}
printf("\n");
}
else{
for( i=l ; i<=m ; i++ )//这个循环控制了开头的数字的交换
{
swap(list[i],list[l]);
perm(list,l+1,m);//每递归一层就确定了一个数,还要注意前面的for循环
swap(list[i],list[l]);//换回来
}
}
}
int main()
{
int a[100],m,i;
printf("请输入你想求得排列数:");
scanf("%d",&m);
for( i=0 ; i<=m ; i++ ){
scanf("%d",&a[i]);
}
printf("\n");
perm(a,0,m);
getchar();
return 0;
}