全排列的遞迴實現

2021-08-08 16:04:56 字數 1189 閱讀 1597

吃個栗子。

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

可以得到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代表全排列函式。

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

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

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

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

實現**如下:

#include #define n 10

int a[n];

void swap(int *a, int *b)

void perm(int *a, int l, int r)

printf("\n");

} else

}} int main()

perm(a, 0, 2);

return 0;

}

遞迴實現全排列

生成全排列的最簡單的遞迴方法的思想 1.可以把幾個數字分成前半部和最後一位。對於0123這四個數來說,最後一位 紅色字型 所出現的情況只有以下四類 先不管前三個數的排列組合情況 3 2 1 0這樣我們就把四個數字的排列問題,變成了3個 對於上述的每一行來說 2.終結條件是1個數字的排列就是其本身。直...

遞迴實現全排列

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.依次遞迴進 好了,知道演算法之後就...