排列
a,b,c的排列形式有abc,acb,bac,bca,cab,cba炼绘,六種排列方式织盼。
采用遞歸的方法來實現(xiàn)排列。眾所周知姑廉,遞歸分為兩個部分缺亮,一個是基礎部分,一個是遞歸部分桥言。在解決排列問題中萌踱,遞歸的基礎部分是:當只有一個元素時,排列就是它本身号阿。
下面主要分析遞歸部分并鸵。令E={e1,e2,...,en}表示n個元素的集合。Ei表示E中去除了第i個元素后的集合扔涧,perm(X)表示對集合X的排序园担,顯然當集合X只有一個元素時{x},perm({x})=x枯夜。ei.perm(X)表示在所有X的排列前面加上ei弯汰。例如E={a,b,c};E1={b,c},perm(E1)=(bc,cb),e1.perm(E1)=(abc,acb)。所以當n>1時湖雹,perm(E) = e1.perm(E1)+e2.perm(E2)+...+en.perm(En).這種遞歸定義形式采用n個perm(X)來定義perm(E),其中每個X包含n-1個元素咏闪。
代碼如下:
[cpp]view plaincopy
#include
usingnamespacestd;
template
inlinevoidSwap(T&?a,T&?b)
{
T?temp?=?a;
a?=?b;
b?=?temp;
}
template
voidPerm(T?list[],intk,intm)
{
inti;
if(k==m)
{
for(i=0;?i
{
cout<
}
cout<
}
else
{
for(i=k;?i
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
intmain()
{
charlist[]?=?{'a','b','c'};
Perm(list,0,3);
return1;
}