zoukankan      html  css  js  c++  java
  • 全排序递归算法

    给定n(n>=1)个元素的集合,输出该集合的所有可能的排列。

    如abc的全排列的个数为3!=6个

    分别为:abc,  acb              a开头的bc全排列

        bac,     bca        b开头的ac全排列

        cba,  cab        c开头的ba全排列

    递归的线索是后面跟着...的全排列,也就是n个元素的排列问题可以转化为n-1个元素的排列问题

    代码如下:

     1 /*
     2 递归是从前往后执行,结果从后往前回溯 
     3     abcd的全排列为 1次 
     4                    a bcd的全排列  a和a换位置之后  转化为求bcd的全排列    求完排列后需要换回来保证初始字符串不变 
     5                    b acd的全排列  a和b换位置之后  转化为求acd的全排列    求完排列后需要换回来保证初始字符串不变 
     6                    c bad的全排列  a和c换位置之后  转化为求bad的全排列    求完排列后需要换回来保证初始字符串不变 
     7                    d bca的全排列  a和d换位置之后  转化为求bca的全排列    求完排列后需要换回来保证初始字符串不变 
     8     结束条件:当只剩最后一个字母时,他的全排列就是他自己 
     9 */
    10 
    11 #include<stdio.h>
    12 #define  SWAP(x,y,t)   ((t=x),(x)=(y),(y)=(t))
    13 void perm(char *list,int i,int n); 
    14 int main()
    15 {
    16     char a[5]="abcd";
    17     perm(a,0,3);
    18     printf("%s",a);
    19     return 0;
    20  } 
    21 
    22 void perm(char *list,int i,int n)
    23 {
    24     int j,temp;
    25     if(i == n){                        //当i是最后一个元素时递归结束 
    26         for( j = 0; j <= n; j++ )
    27             printf("%c",list[j]);
    28         printf("
    ——————
    ");
    29     }
    30     else{
    31         for( j = i ; j <= n ; j++ ){ //求i到n的全排列 
    32             SWAP(list[i],list[j],temp);//以每一个元素为开始的全排列 
    33             perm(list,i+1,n);        //求i+1到n的全排列 
    34             SWAP(list[i],list[j],temp);//保证初始数组不变 
    35         } 
    36     }
    37  } 
    38  
    39  
    40  
  • 相关阅读:
    使用 kubeadm 部署 v1.18.5 版本 Kubernetes 集群
    MHA高可用主从复制实现
    基于Keepalived高可用集群的MariaDB读写分离机制实现
    MariaDB主从半同步复制详解
    postman学习网址
    程序员的脑子是更新换代最快的
    带组装3ROS_1节点_192通道
    带组装4ROS_1节点_256通道
    带组装5ROS_1node_320Chan
    带组装7ROS_1节点_448通道
  • 原文地址:https://www.cnblogs.com/hysz/p/7125393.html
Copyright © 2011-2022 走看看