abc的全排列

對a,b,c進行全排列輸出如

['a', 'b', 'c']
['a', 'c', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']

用遞歸思想來實現,大體思路:每個元素都會可能會充當新排列的隊頭,所以產生了一個for循環,複雜度是n用於交換頭部元素和第i個元素,交換完畢產生新的隊列,如
[‘b’, ‘a’, ‘c’]
接下來對第二個元素到隊位進行全排列(python中傳遞ls和倆座標, 切勿傳遞切片),直到傳入的座標重疊便是遞歸的出口,也可以在這裏先打印。因爲我們一直對ls進行排序,所以這裏我們對元素位置還原初始狀態是爲了進行下一次的排序。
整體思路很簡單,就是遞歸有序的交換元素。至於爲什麼會產生原順序的[‘a’, ‘b’, ‘c’],因爲我們每次都對第一個元素和第一個元素進行了交換。

def swap(ls, i, j):
    ls[i], ls[j] = ls[j], ls[i]

def perm(ls, p, q):
    if p == q:
        print(ls)
        return
    for i in range(p, q+1, 1):
        swap(ls, p, i)
        perm(ls, p+1, q)
        swap(ls, i, p)  # 還原

if __name__ == "__main__":
    # ls = ["a", "b", "c", "d"]
    ls = ["a", "b", "c"]
    num = len(ls)
    for i in range(num):
        swap(ls, 0, i)
        perm(ls, 1, num-1)  # 還原
        swap(ls, i, 0)

一定要記得還原原來的數組。視頻講解鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章