转自:https://blog.csdn.net/xiazdong/article/details/7986015
我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树:
![](https://img2018.cnblogs.com/blog/1720558/201910/1720558-20191003101914363-298765222.png)
从第一个数开始枚举确认,接着进入下一个递归即枚举下一个数,直到最后一个数被确认到达出口。
如确认了第一个数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); //换过去后再还原 } } }