全排列的实现

概念

  从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; 
 } 

  运行结果如下图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值