生成全排列的最簡單的遞迴方法的思想:
1.可以把幾個數字分成前半部和最後一位。
對於0123這四個數來說,最後一位(紅色字型)所出現的情況只有以下四類(先不管前三個數的排列組合情況): *
**3*
**2*
**1*
**0這樣我們就把四個數字的排列問題,變成了3個(對於上述的每一行來說)。
2.終結條件是1個數字的排列就是其本身。
直接看乙個用遞迴方法得到的結果和只看最後一位的分類情況:
幾個可能遇到的疑問:
q:為什麼要分成前半部和最後一位?
a:這個是為了程式設計的方便。你想想,陣列的指標在第一位。如果你規定第一位和後半部。陣列的指標就要移動。
q:什麼時候輸出?
a:當你判斷到乙個數字的排列問題的時候。因為除了這個數字的其他數字位置已經固定了,這實際上就生成了乙個全排列。
q:某一位的數字怎麼確定?
a:如果分成前半部和最後一位,則將左邊的每一位和當前位交換。
源**(vs 2010):
#include #include #include int array = ;
int num = 4;
void swap(int *parr,int a,int b)
void pt(int *parr,int n)
{ if(n==1){
for (int i=0;i
遞迴實現全排列
1 如果運算力,和理亂麻的水平不夠。盡量不要復用本地變數 比如c用來計數,不計數後 又用來做其它比如作為步長 除非你確認不會出現問題。2 盡量讓每個邏輯單元 函式內可以有多個邏輯單元 盡量小,邏輯盡量要清晰 3 語言組織能力有限,就說這些了。未整理,抱歉了 include stdafx.h incl...
全排列遞迴實現
一 遞迴版本 1 演算法簡述 簡單地說 就是第乙個數分別以後面的數進行交換 e g e a b c 則 prem e a.perm b,c b.perm a,c c.perm a,b 然後a.perm b,c ab.perm c ac.perm b abc acb.依次遞迴進 好了,知道演算法之後就...
全排列 遞迴實現
前面我們介紹了全排列的非遞迴演算法,現在我再來寫一下全排列的遞迴演算法 這兩種演算法的演算法思路並不相同。遞迴演算法的思路比較接近於我們現實生活中的思路。1.試想,我們只有兩個數字 12.要對它進行全排列,第一種方式就是12本身,第二種,將12交換,變為21即可。這提示了我們一種交換的思路。2.但這...