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

    转自:https://blog.csdn.net/xiazdong/article/details/7986015

    我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树:
     
    从第一个数开始枚举确认,接着进入下一个递归即枚举下一个数,直到最后一个数被确认到达出口。
    如确认了第一个数1,则确认第二个数为2,接着确认3,一次递归结束输出123
    返回到上一层第二层,确认第二个数的枚举{2,3}只有3没被枚举,确认第二个数为3,接着第三个数为2,输出132;
    返回第二层,无可枚举数,再返回上一层即确认第一个数{1,2,3},确认第一个数为2,重复上述,确认第二个数为{1,3},枚举。。。。
    直到所有数都枚举完,则递归结束,全排列完成。
    核心代码:
    void perm(int arr[], int begin,int end) {		
      if(end==begin)
      { //一到递归的出口就输出数组,此数组为全排列     for(int i=0;i<=end;i++)
        {       printf("%d",arr[i]);     }     printf(" ");     return;   }else
       {
        for(int j=begin;j<=end;j++)
        {     swap(begin,j); //for循环将begin~end中的每个数放到begin位置中去 交换两个数
        perm(arr,begin+1,end); //假设begin位置确定,那么对begin+1~end中的数继续递归
        swap(begin,j); //换过去后再还原     }   } }

      

  • 相关阅读:
    一、反射机制介绍_Class 对象获取
    六、.XPATH 技术_快速获取节点
    五、.DOM4J 方式解析 XML 数据
    四、.JDOM 解析 XML 数据
    三、SAX 方式解析 XML 数据
    二、DOM方式解析XML
    一、Schema验证XML
    三、线程同步Synchronized
    二、线程状态
    JDK8Lambda和方法的引用
  • 原文地址:https://www.cnblogs.com/Theo-sblogs/p/11619277.html
Copyright © 2011-2022 走看看