集合R={1,2,3,4}的全排列 可以分解為:1,{2,3,4}的全排列 + 2,{1,3,4}的全排列 + 3,{1,2,4}的全排列 + 4,{1,2,3}的全排列。 繼續分解:{2,3,4} 為 2,{3,4}的全排列,3,{2,4}, 4,{2,3}……………………………… ………… 直到集合裡只有一個元素,就可直接輸出了. [cpp] #include <iostream> using namespace std; //char * str; //int len = 2; /** *產生list[start:end]的所有排列, 通常為0,len-1 */ template <class Type> void Perm(Type list[],int start,int end){ //單元素序列 if( start == end){ //即此時集合裡只有一個元素 for(int i=0; i<=end; i++) cout << list[i]; cout << endl; } //多元素序列,遞歸產生排列 else{ for(int i= start; i<= end; i++){ Swap(list[start], list[i]);//交換可得:1,{2,3,4} ; 2,{1,3,4}; 3,{1,2,4}; 4,{1,2,3} Perm(list, start+1, end); Swap(list[start], list[i]);//輸出排列之後,要再交換回到初始狀態:{1,2,3,4} } } } template <class Type> inline void Swap(Type &a, Type &b){ Type temp = a; a = b; b = temp; } int main() { char str[] = "abcd"; Perm(str, 0,3); //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } 輸出: abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc