全排列(遞迴做法)

2021-09-06 10:29:20 字數 937 閱讀 4697

排列:從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列;

全排列:當n==m時,稱為全排列;

比如:集合的全排列為:

排序思路:(遞迴)

(1)n

個元素的全排列=(n-1個元素的全排列)+(另乙個元素作為字首);

(2)出口:如果只有乙個元素的全排列,則說明已經排完,則輸出陣列;

(3)不斷將每個元素放作第乙個元素,然後將這個元素作為字首,並將其餘元素繼續全排列,等到出口,出口出去後還需要還原陣列;

用圖形表示為:

黑色方框表示:選取每乙個元素作為字首,後面的資料再進行全排列,直到待排序佇列只有乙個元素,這時這一趟排列結束,列印出。

偽**分析:

函式:void perm(int *arr,int head,int tail);

//head:進行排列的第乙個元素下標

//tail:進行排列最後乙個元素下標

因為perm(n) = arr[0]perm(n-1)+arr[1] perm(n-1)+……+arr[n-1] perm(n-1)

所以這裡用遞迴的做法,遞迴結束條件是perm(1) = arr[x];

偽**說明:

void perm(int *arr,int head,int tail)

else }

}

完整**以及程式執行結果:

void showarray(int *arr,int len)

{ for(int i = 0;i4個元素的全排列:

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

遞迴全排列

遞迴思想,用重複的簡單過程實現乙個複雜的專案,遞迴要素有 1 遞迴的每一層,規模要逐漸縮小 2 遞迴必須有出口,一般每個遞迴函式一開始,是判斷遞迴成立的條件 3 遞迴包括遞進過程和返回過程 4 要注意遞迴實現次數,一般在呼叫遞迴函式前加上遞迴重複條件 常見的結構是 遞迴函式 if 條件成立,例如規模...

全排列(遞迴)

給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小的排列在前面。...