全排列递归算法

匿名 (未验证) 提交于 2019-12-03 00:13:02

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

  

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!