全排列問題(遞迴)

2022-03-13 08:22:53 字數 1119 閱讀 7153

上次上課老師講了全排列演算法,現在剛剛看自己的寫的全排列演算法,看了好一會才看懂。。。。

應該是自己理解的不夠徹底

所以今天徹徹底底的來分析一下

先看圖:

思路:先固定乙個字元,然後將固定的字元與它後面的每乙個進行交換,一直遞迴下去,直到固定的字元後面只有乙個字元

我們先看看圖,框外面的字元是被固定的字元,框裡面的字元的沒有被固定的字元,具體做法就是每次將框裡面的第乙個字元與框裡面的字元交換(框裡面第乙個與第乙個交換,第乙個與第2個交換,第乙個與第3個交換.........第1個與第n個交換),直到框裡面只剩下乙個字元的時候,輸出此時的字元排列,但是輸出之後又要將字元的位置還原會來。。。(我覺得我講的有點不太好理解),所以外面現在直接來對圖分析吧

假設有abc三個字元,求全排列

看第0層,abc三個字元都在框裡面,所以將第乙個字元a和第乙個字元,第二個字元,第三個字元交換得到:abc,bac,cba,這三個字串構成了第1層,現在第一層的框裡面還有兩個字元,所以外面應該繼續遞迴,直到框裡面還剩下乙個字元就輸出這個字串,所以第一層的abc字串bc還在框裡面,所以將b和b交換,將b和c交換,一共兩種情況,(框裡面第乙個與第乙個交換,第乙個與第2個交換,第乙個與第3個交換.........第1個與第n個交換,一共n種情況)

全排列可以看做固定前i位,對第i+1位之後的再進行全排列,比如固定第一位,後面跟著n-1位的全排列。那麼解決n-1位元素的全排列就能解決n位元素的全排列了

**如下:

#include#include

int k=0

;char a[100

];long

long count=0;//

全排列個數的計數

void s(char a,int i,int k)//

將第i個字元和第k個字元交換

void f(char a,int k,int

n)

inti;

for(i=k;i)

}int

main()

有任何不足錯誤的地方歡迎拍磚指正哦!!!!!

技術在於分享

遞迴求解全排列問題

遞迴求解全排列問題 求解思想 排列中每乙個數字,都有一次當最前單一綴的機會,例如 排列陣列 a 1.當a中只有1個數字的時候,a 1 則只有1個數字做單一字首和字尾,則只有一種 1!1 可能 a1,直接輸出 2.當a中只有2個數字的時候,a 2 則a1,a2分別有一次機會做單一字首的機會,2!2 3...

全排列問題(遞迴呼叫)

題目如下 給乙個數字n,求1到n之間的數字的全排列。input 多組輸入,以eof結束 1 n 8 output 對於每個n,輸出1到n的全排列 按字典序輸出全排列 每個排列一行 相鄰兩個數字之間隔乙個空格 sample input sample output 1 2 3 1 3 2 2 1 3 2...

遞迴之全排列問題

一 問題 設計乙個遞迴演算法生成n個元素的全排列。二 思路 其實就是將整個序列a 的每個元素一一提到序列a首個位置即a i 三 include using namespace std void swap int a,int b list k m 的所有排列,k是序列首下標,m是序列最後乙個下標 vo...