演算法 全排列遞迴解法

2021-09-26 21:06:52 字數 1097 閱讀 7954

問題:有一組數r,需要輸出它的全排列。r的遞迴可定義如下:

當個數n為1時,perm® = ®,其中r是集合r中唯一的元素

當個數n大於1時,perm®由(r1)perm(r1),(r2)perm(r2),(r3)perm(r3),…,(rn)perm(rn)構成

其中ri = r - 即該集合中減去對應元素

思路其實說直白點,就是遞迴地把這組數規模乙個乙個地縮小,如1,2,3,4. 先把1固定,遞迴地求2,3,4的全排列,又把2固定,遞迴地求3,4的全排列……直到只剩乙個數,輸出這個排列。

當獲取遞迴陣列時,從該組數的第乙個,依次和每一位交換(包括本身),得以產生乙個新遞迴陣列(如1,2,3,4,先是1和1交換,產生新的2,3,4)

當1和1交換產生的所有遞迴完成之後,實際上已經完成了1234,1243,1324,1342,1432,1423的輸出,因為1和自己交換之後,產生了2,3,4

在這個過程中,當1,2,3固定時,只有4剩餘,所以輸出1,2,3,4.然後固定1,2,交換3,4的位置。輸出1,2,4,3.此時1,2固定的已經全部輸出,於是返回到只有1固定,那麼此時2需要與3交換位置,再進行1,3固定的遞迴

其實說這麼多,還不如一張圖來得實在:

輸出:1234

1243

1324

1342

1432

1423

2134

2143

2314

2341

2431

2413

3214

3241

3124

3142

3412

3421

4231

4213

4321

4312

4132

4123

c全排列解法 非遞迴

只要對字串求出字典序即可實現全排列 求法 要考慮全排列的非遞迴實現,先來考慮如何計算字串的下乙個排列。如 1234 的下乙個排列就是 1243 只要對字串反覆求出下乙個排列,全排列的也就迎刃而解了。如何計算字串的下乙個排列了?來考慮 926520 這個字串,我們從後向前找第一雙相鄰的遞增數字,20 ...

全排列的非遞迴解法

題目 找到12345的全排列所有結果。思路 所有的全排列組成的數字中,12345最小,54321最大。演算法本質是找到給定數字m1的下乙個數字m2,m2是所有全排列組成的數字集合中大於m1的數字組成的集合的最小值。比如12345下一位是12354。1,從右往左找到非公升序的第一位數 例如12543中...

全排列遞迴演算法

全排列是將一組數按一定順序進行排列,如果這組數有n個,那麼全排列數為n 個。現以為 例說明如何編寫全排列的遞迴演算法。1 首先看最後兩個數4,5。它們的全排列為4 5和5 4,即以4開頭的5的全排列和以5開頭的4的全排列。由於乙個數的全排列就是其本身,從而得到以上結果。2 再看後三個數3,4,5。它...