zoukankan      html  css  js  c++  java
  • 递归进行全排列

    思路:

    设R={r1,r2,..rn} 是要进行排列的n个元素,Ri=R-{ri}.集合X中元素的全排列记为perm(X);

    设(ri)perm(X)表示每一个全排列前加上前缀ri得到的排列.当n=1时,perm(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 m = *a;   

    *a = *b;   

    *b = m;  

    }   

    void perm(int list[], int k, int m, int *pn) 

    {   

    int i = 0;  

    /* 递归结束条件,只剩下一个数的全排列

    * 实际上递归进行到这里,perm的最后一层正好进行了n!次

    * 前面的每一层返回时都不输出,只有最后一层输出*/

    if(k == m)

    {   

    for(i=0; i<=m; i++)  

    {

    printf("%d", list[i]);

    }

    printf("\t"); 

    (*pn)++;   

    }   

    else   

    {   

    /*取出n个数中的一个,对剩下的n-1个数进行全排列*/

    for(i = k; i <= m; i++)   

    {   

    swap(&list[k], &list[i]);

    perm(list, k+1, m, pn);   

    swap(&list[k], &list[i]);   

    }   

    }  

    }  

    int main()  

    {   

    int n = 0;//计数全排列的总个数

    int list[] = { 1, 2, 3, 4, 5 };   

    perm(list, 0, sizeof (list)/sizeof (list[0])-1, &n);   

    printf("total:%d\n", n);   

    return 0;  

    }

  • 相关阅读:
    配置log4j不同方法打印到不同的日志中
    Logging日志信息(转)
    Mybatis 动态sql
    mysql字段截取(转)
    tomcat多个端口配置
    Map,list,set,集合转化
    简单测试java
    java中有关自增的问题
    DMA复习
    笔试题
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196377.html
Copyright © 2011-2022 走看看