演算法遞迴 集合的全排列問題

2021-10-05 03:03:20 字數 1006 閱讀 1101

設集合 r=,顯然全排列的數目為 n!。

那麼如何顯示集合的所有全排列呢?

可以用遞迴的方式實現。

解題思路

如果集合有n個元素,那麼就可以看作 n-1個元素全排列之後再加上 剩下的那個元素,因為是全排列,所以每乙個元素都會剩下一次。(例如:

r=的全排列。

若 1 剩下,則 先進行排列,再與1結合,結果是 1 23,1 32。

若 2 剩下,則排列,與2結合,結果是 2 13, 2 31。

若 3,結果為 3 12 , 321。)

繼續,n-1 個數的全排列又可以看作 n-2 個數的全排列,再與剩下的那個數結合。這就與剛剛的操作重複了,一層層的往下簡化,直到最後,數列中只剩下了1個元素,遞迴就結束了。

來看具體實現

//定義乙個陣列,表示集合

//引數k為起始排列數的下標,m為結束下標。

void perm(int list, int k, int m)

{ if(k==m) //遞迴結束標誌,起始下標=結束下標,代表集合內就乙個數了。

{ for(int i=0;i<=m;i++)

cout<總結

這一種解題方法是通過遞迴演算法改變陣列中元素的位置然後輸出。

利用遞迴,將n個元素步步分解:

n變成 剩下的任意乙個數(n種情況)和n-1個數。

…直到還剩下了最後乙個元素,作為遞迴結束的標誌。

在陣列中位置的交替也是難點,直接上圖好理解

剩餘 1 的情況是第一列,

剩餘 2 的情況是第二列

…會發現,第一列與第二列的區別就在於,1 與 2 的位置不同,則要求第二列的排列時,只需讓2 代替1的位置即可,其他列也是如此。

排列問題(全排列的遞迴演算法問題)

題目 設計乙個遞迴演算法生成n個元素的全排列。演算法講解 設r 是要進行排列的n個元素,ri r 集合x中元素的全排列記為perm x ri perm x 表示在全排列perm x 的每乙個排列前加上字首得到的排列。r的全排列可歸納定義如下 當n 1時,perm r r 其中r是集合r中唯一的元素 ...

遞迴演算法之全排列問題

2 數字全排列 numlist.pas in out 列出所有從數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現重複的數字。輸入乙個整數n 1 n 9 輸出由1 n組成的所有不重複的數字序列,每行乙個序列,數字與數字之間用空格隔開,行首行尾不留空格。樣例輸入 numlist.i...

全排列演算法 遞迴出口問題

1.使用全域性變數傳遞返回值2.利用標準輸入輸出裝置傳遞返回值 3.在函式引數中加入乙個預設入參用於遞迴之間傳遞 1.思路 n的全排列可以看做是在n 1全排列基礎上插入第n個數defg n result ifn 1 return 0 else forxing n 1 foriinrange n x....