對於數字的全排列問題,相比於使用窮舉法來說,通過遞迴法來解決可以大大減少演算法的時間複雜度與空間複雜度,使用遞迴演算法的好處即是:拋給程式乙個執行條件,乙個約束條件(結束遞迴過程),程式便可自己完成所有過程。
輸入乙個數字n,使用遞迴演算法輸出1~n所有的排列
/*全排列問題*/
#includeusing namespace std;
int a[10],book[10],n;//陣列a用來分別儲存這n個數(n<10),陣列book用來記判斷每個陣列a的每個元素是否被訪問。
void dfs(int step)//step用來指向陣列a的下標
**雖短,但是卻很深刻的體現出了用遞迴演算法求全排列等問題的簡潔性,可是對於遞迴過程的理解,我還是感到力不從心,於是在參看了一些csdn大神的解讀,根據乙個測試**,來探析遞迴的過程
這就不難解釋了遞迴演算法"不撞南牆不回頭「的特點了,可以看出:***必須要有乙個標誌來結束遞迴的過程,當執行到最深處時, 程式會轉移到上一層繼續進行遞迴,且反向遞迴(回溯過程)中函式的執行順序是和正向遞迴相反的。***對於計算全排列的那塊**,我在dfs(step+1)後面增加了一行輸出step的語句,**塊及結果如下:
我是這樣理解的:當step=4時,即標誌整個過程開始準備回溯,step回溯到上一級,即step=3,並輸出dfs()後面的語句,此時標誌a[3]未訪問,由於要尋找乙個新的排列,程式繼續回溯,到step=2時,嘗試將3放入a[2],2放入a[3]中,這時滿足生成乙個新排列的條件,故輸出一行新的排列結果,此後的過程也是如此。
解釋還有許多紕漏,忘高手指正!
兩篇正在看的部落格,安利給大家:**遞迴演算法的執行原理,遞迴的基本原理
全排列遞迴演算法
全排列是將一組數按一定順序進行排列,如果這組數有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個不同元素中,任取...
全排列遞迴演算法
對於乙個長為 n 的陣列,它的全排列一共有 n!種可能,演算法複雜度最小為o n!如果還需要列印出結果,那麼演算法複雜度為 o n n!演算法設計的思路是,對於第一位給定乙個值,剩下的 n 1 位進行全排列,然後通過乙個迴圈遍歷第一位所有可能的值,這裡我們是通過交換來改變第一位的值,對於 n 1 位...