全排列递归算法

Posted theo-sblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列递归算法相关的知识,希望对你有一定的参考价值。

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

  

 

 

以上是关于全排列递归算法的主要内容,如果未能解决你的问题,请参考以下文章

全排列算法--递归实现(Java)

递归解决全排列生成算法

全排列问题的递归算法(Perm)

PHP实现全排列(递归算法)

全排列递归算法

全排列(Perm)的递归实现算法