C 輸出全排列遞迴演算法詳細解釋

2021-09-24 03:12:21 字數 1562 閱讀 5680

運用了圖的遍歷演算法:dfs深度優先遍歷

中心思想: 

設r=是要進行排列的n個元素,ri=r-. 

perm(x)表示在全排列perm(x)的每乙個排列前加上字首ri得到的排列。 

(1)當n=1時,perm(r)=(r),其中r是集合r中唯一的元素; 

(2)當n>1時,perm(r)可由(r1)+perm(r1),(r2)+perm(r2),…,(rn)+perm(rn)構成。

那麼具體程式要怎麼實現呢?我們來個實際的例子,假設有一數列1,2,3,4 

那麼1,2,3,4的全排列 

perm()=1perm()+2perm()+3perm()+4perm(1,2,3) 

那麼我們只要將每個數,與第乙個數交換不就可以得到下乙個序列了嗎? 

比如第乙個與第二個數交換,那麼不就得到2 了,接下來我們用乙個實際的例子說明該程式是怎樣執行的

具體演算法流程:

數列: 第乙個與第乙個交換 

可以得到1 將序列放進perm函式遞迴,然後

——遞迴 

數列第乙個與第乙個交換 

得到2 ,輸出1,2,3 (此時low=high,因為序列只有一位數,因此輸出列表list) 

數列第乙個與第乙個交換回來,結果仍然是 

數列第乙個與第二個交換 

得到3,輸出1,3,2 

又第乙個與第二個交換回來,變回 

—–遞迴完畢序列恢復原狀

數列: 第乙個與第二個交換 

可以得到2, 

——遞迴 

數列第乙個與第乙個交換 

得到1 ,輸出2,1,3 

數列第乙個與第乙個交換回來,結果仍然是 

數列第乙個與第二個交換 

得到3,輸出2,3,1 

又第乙個與第二個交換回來,變回 

—–遞迴完畢 

序列第乙個與第二個交換 

序列恢復原狀

數列: 第乙個與第三個交換 

可以得到3, 

——遞迴 

數列第乙個與第乙個交換 

得到1 ,輸出3,1,2 

數列第乙個與第乙個交換回來,結果仍然是 

數列第乙個與第二個交換 

得到2,輸出3,2,1 

又第乙個與第二個交換回來,變回 

—–遞迴完畢 

序列第乙個與第二個交換 

序列恢復原狀

演算法可以簡單地寫作 

perm()=1perm()+2perm()+3perm() 

perm()=2perm()+3perm() 

perm()=1perm()+3perm() 

perm()=1perm()+2perm()

c++**:

#include

using namespace std;

void swap(int &a,int &b)

void perm(int list,int low,int high);

perm(list,0,2);

return 0;

}程式結果:

123132

213231

321312

遞迴輸出全排列

輸入整數n n 0,10 按字典序輸出1 n的全排列。解法是暴力排序,核心思想在於依次確定每位數字,確定每位數字的方法相同,故可使用遞迴。每位數字均是從1開始檢驗,確定了一位後進行標記,遞迴進入下一位的確定,遇到已經標記的數字則跳過。字典序的完成 順序的檢查帶來了順序的排列。step記載了每一位上的...

全排列遞迴演算法

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

全排列(遞迴演算法)

一 全排列演算法 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。公式 全排列數f n n 定義0 1 演算法 遞迴演算法 網路上偷了乙個圖 全排列 順便複習乙個數學公式 排列的定義 從n個不同元素中,任取...