一个关于排列的算法,看不懂,请高手指教
一本算法书上的关于排列的算法:
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个元素是排好的,所以只要向后枚举就行了