遞迴實現全排列

2021-06-04 22:47:52 字數 736 閱讀 1231

生成全排列的最簡單的遞迴方法的思想:

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.但這...