全排列递归算法

转自: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("\n");     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); //换过去后再还原     }   } }

  

 

 

posted on 2019-10-03 10:36  H_Theo  阅读(308)  评论(0编辑  收藏  举报

导航