zoukankan      html  css  js  c++  java
  • 全排列(Perm)的递归实现算法

    https://blog.csdn.net/zhi_jin/article/details/69267230

    什么是全排列】

    从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。用123来示例下,123的全排列有123、132、213、231、312、321这六种。

    【题目】

    设计一个递归算法生成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)构成。
    实现思想:将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。

    【示例】

    当n=3,并且E={a,b,c},则:
    perm(E)=a.perm({b,c}) + b.perm({a,c}) + c.perm({a,b})
    perm({b,c})=b.perm(c) + c.perm(b)
    a.perm({b,c})=ab.perm(c) + ac.perm(b)=ab.c + ac.b=(abc, acb)


    【递归实现】

    123的全排列有123、132、213、231、312、321这六种。首先考虑123、213和321这三个数是如何得出的,是1与自身、2、3交换得到的;然后考虑123与132、213与231、312与321是如何得出的,即时第一个数字不变,第二个数和每三个数交换得到。找到这个规律后,递归的代码就很容易写出来了。

    【c++代码实现】

      1. #include<iostream>
      2. #include<algorithm>
      3.  
      4. using namespace std;
      5.  
      6. template<class Type>
      7. void Perm(Type list[], int k, int m)
      8. { //产生[list[k:m]的所有排列
      9. if (k == m)
      10. {  //只剩下一个元素
      11. for (int i = 0; i <= m; i++)
      12. cout << list[i];
      13. cout << endl;
      14. }
      15. else  //还有多个元素待排列,递归产生排列
      16. for (int i = k; i <= m; i++)
      17. {
      18. swap(list[k], list[i]);
      19. Perm(list, k + 1, m);
      20. swap(list[k], list[i]);
      21. }
      22. }
      23.  
      24. int main()
      25. {
      26. char s[] = "abcd";
      27. Perm(s, 0, 3);
      28.  
      29. system("pause");
      30. return 0;
      31. }
  • 相关阅读:
    According to TLD or attribute directive in tag file, attribute end does not accept any expressions
    Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.
    sql注入漏洞
    Servlet—简单的管理系统
    ServletContext与网站计数器
    VS2010+ICE3.5运行官方demo报错----std::bad_alloc
    java 使用相对路径读取文件
    shell编程 if 注意事项
    Ubuntu12.04下eclipse提示框黑色背景色的修改方法
    解决Ubuntu环境变量错误导致无法正常登录
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/9257708.html
Copyright © 2011-2022 走看看