排列生成 遞迴

2021-07-27 22:28:16 字數 694 閱讀 1814

對於給定的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...