首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个关于排列的算法,看不懂,请好手指教

2013-07-01 
一个关于排列的算法,看不懂,请高手指教一本算法书上的关于排列的算法:templateclass typevoid perm(type

一个关于排列的算法,看不懂,请高手指教
一本算法书上的关于排列的算法:
template<class type>
void perm(type list[],int k,int m)
{ //产生 list[k:m]的所有排列
   if (k==m)
   {//只剩下1个元素
     for(int i=0;i<=m;i++)  cout<<list[i];
     cout<<endl;
   }
   else   //还有多个元素待排列,递归产生排列
    for(int i=k;i<=m;i++)//这个for循环的内容看不懂
   {swap(list[k],list[i]);//当k=0 i=0时,交换的是自己,没有意义啊
    perm(list,k+1,m);
    swap(list[k],list[i]);
   }
}
template<class type>
inline void swap(type & a,type & b)//这个函数看完理解就是交换a b俩个变量的值
{  type temp=a;a=b;b=temp;
}
 
请高手讲解下这个算法的思路,具体到每一步最好。我理解力有点弱,谢谢。 算法?c++ 递归 算法
[解决办法]
首先你要理解递归

代码的大致思路是这样的,Perm(List, k, m)表示给第k个到第m个元素进行全排列,k表示当前第k个元素,前k个已经摆放好位置了,然后只要产生余下的元素的全排列即Perm(List, k+1, m),你的任务只需要枚举当前第k个元素的可能值,由于前面k个元素是排好的,所以只要向后枚举就行了

热点排行