3.經典例題遞歸
設R = {r1,r2,r3......rn}是要進行排列的n個元素,Ri = R-{ri}。集合X中元素的全排列記爲Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每個排列前加上前綴ri獲得的排列。R的全排列可概括定義以下:element
當n = 1時,Perm(R) = (r),其中r是結婚R中惟一的元素。it
當n > 1時,Perm(R)由(r1)Perm(R1),(r2)Perm(R2)......(rn)Perm(Rn)構成。其實這就是一個遞歸過程,拿(r1)Perm(R1)來講,全排列Perm(R1) = Perm( {r2,r3,r4.....rn})以後再在全部排列以前加上r1就能夠了,其中{r2,r3,r4.....rn}又是一個新的集合,能夠由(r2)Perm({r3,r4....rn}),(r3)Perm({r2,r4....rn})......表示,一直遞歸下去,直到最後Perm({rx})也就是隻剩下一個元素時全排列也就是本身了rx,而後再逐步返回加上前面的前綴,這就是(r1)Perm(R1)。class
template <class Type>集合
void Perm(Type list[] int prefix,int length)co
{void
if(prefix == length)//it means there is an element
{
for(int i=0;i<=length;++i)
cout<<list[i]<<endl;//print the value of list
}else{
for(int j = prefix;j<=length;++j)
{
exchange(list[prefix],list[j]);//exchange the value of list[prefix] and list[j]
Perm(list,perfix+1,length);
exchange(list[prefix],list[j]);
}
}
}