對於給定的n>=1的集合,需要列印出該集合所有可能的排列。例如,如果這個集合是{a,b,c},那麼所有可能得排列是:
1. a b c
2. a c b
3. b c a
4. b a c
5. c a b
6. c b a
即 a 加上{b,c}的所有排列
b 加上{a,c}的所有排列
c 加上{a,b}的所有排列
那麼依次類推當 n = 4時{a,b,c,d}排列的就是(只用 a 來說吧,其他同理):
a 加上{b,c,d}的所有排列,
而{b,c,d}的所有排列又可分為(拿b舉例,c,d同理):
b 加上 {c,d}的所有排列,
而{c,d}的排列就兩種,即{c,d}和{d,c}
所以只要是元素個數是 n>=1 個的集合,都可以用遞迴的方法一層一層的簡化,直至簡化至 2 個元素為止(n = 1 除外)
下一步就是交換最後的這 2 個元素,然後再逐級往上加就可以得到該集合所有的不同排列
以下是集合{1,2,3,4}的舉例**:
#includeusing namespace std;
void perm(int a,int k,int n) // k 從 1 開始,n 為元素的個數
{ if(k==n) //輸出排列
{ for(int i=0;i
遞迴,非遞迴生成陣列的所有排列
include include include using namespace std void showarr int arr,int len cout endl 遞迴顯示組合 void recursivecomb int arr,int len,int start if start len 1 ...
遞迴解決全排列生成演算法
排列 從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列 全排列 當n m時,稱為全排列 比如 集合的全排列為 方法一 我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為的排列列舉樹,此樹和我們這裡介紹的演算法完全一致 演算法思路 1 n個元素的全排列 n 1個元素的全排列 另乙...
生成可重集的排列 (遞迴過程)
解釋一下劉汝佳的 就是這個遞迴只會考慮相同元素的第乙個,所以與前乙個相同的元素應當被忽略,第乙個元素由於沒有前面的元素,所以應當取走。注意這一行 觀察用例 3 1 1 1 有了這行 只會輸出乙個 1 1 1 但沒有這行 就會輸出27 個 1 1 1 3層迴圈,每層3個 3 3 可重集的全排列2 ru...