演算法設計與分析(第三週)遞迴實現全排列問題

2021-09-11 20:56:53 字數 1468 閱讀 6387

問題是有一組數r,需要輸出它的全排列。r的遞迴可定義如下:

當個數n為1時,perm® = ®,其中r是集合r中唯一的元素

當個數n大於1時,perm®由(r1)perm(r1),(r2)perm(r2),(r3)perm(r3),…,(rn)perm(rn)構成

其中ri = r - 即該集合中減去對應元素

其實說直白點,就是遞迴地把這組數規模乙個乙個地縮小,如1,2,3,4. 先把1固定,遞迴地求2,3,4的全排列,又把2固定,遞迴地求3,4的全排列……直到只剩乙個數,輸出這個排列。

當獲取遞迴陣列時,從該組數的第乙個,依次和每一位交換(包括本身),得以產生乙個新遞迴陣列(如1,2,3,4,先是1和1交換,產生新的2,3,4)

當1和1交換產生的所有遞迴完成之後,實際上已經完成了1234,1243,1324,1342,1432,1423的輸出,因為1和自己交換之後,產生了2,3,4

在這個過程中,當1,2,3固定時,只有4剩餘,所以輸出1,2,3,4.然後固定1,2,交換3,4的位置。輸出1,2,4,3.此時1,2固定的已經全部輸出,於是返回到只有1固定,那麼此時2需要與3交換位置,再進行1,3固定的遞迴

其實說這麼多,還不如一張圖來得實在:

演算法分析與設計(第三週) 已完結

本週知識要點 3.1 c語言中的型別轉換機制 3.2 整數次冪 高次數的快速計算 3.3 篩選素數演算法 規則 丟掉高位元組部分,只保留低位位元組。長整數的值若在短整數的範圍內,則轉換結構保持不變。規則 如果短整數帶符號,則長整數高位元組bit填充符號 否則填0 unsigned的作用,僅在於賦更大...

程式設計與演算法(一)第三週測驗

描述 乙個最簡單的計算器,支援 四種運算。僅需考慮輸入輸出為整數的情況,資料和運算結果不會超過int表示的範圍。乙個最簡單的計算器,支援 四種運算。僅需考慮輸入輸出為整數的情況,資料和運算結果不會超過int表示的範圍。輸入 輸入只有一行,共有三個引數,其中第1 2個引數為整數,第3個引數為操作符 輸...

演算法作業 5 2017 3 7第三週

解析 題目要求很簡單 反轉乙個單鏈表。乙個比較簡單的思路就是頭插法,依次去下鍊錶,然後插入到新鍊錶的頭結點的下乙個。由於題目沒有定義頭結點,為了操作方便,定義兩個空頭結點指向鍊錶。只需要遍歷一次鍊錶,所以時間複雜度為o n 如下 definition for singly linked list.s...