簡體   English   中英

通過回溯了解排列

[英]Understanding permutations with backtracking

我試圖弄清楚以下回溯解決方案如何生成作為列表給出的所有整數排列:

def permutations(arr):
    res = []
    backtrack(arr, [], set(), res)
    print(res)

def backtrack(arr, temp, visited, res):
    if len(temp) == len(arr):
        res.append(temp[:])
    else:
        for num in arr:
            if num in visited: continue
            visited.add(num)
            temp.append(num)
            backtrack(arr, temp, visited, res)
            visited.remove(num)
            temp.pop()

執行以下操作:

permutations([1, 2, 3])

結果如預期:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

我不明白的是循環結束時的temp.pop()調用。 我知道pop()丟棄列表的最后一個元素,但為什么這里有必要?

如果有人能向我解釋這一點,我將不勝感激。

這是必要的,因為在下一次迭代中,該函數將再次append一個元素,因此如果您沒有事先pop列表,則列表的大小會不斷增長。 由於僅當temp的長度等於原始arr的長度時, backtrack才會添加結果,因此不會添加超出第一個排列[1, 2, 3] (因為從那時起, temp列表不斷增長)。

我們可以刪除該行( temp.pop() )並查看結果:

[[1, 2, 3]]

現在,如果我們還更改了結果在len(temp) >= len(arr)時添加的結果,那么我們將看到temp的大小如何增長:

[[1, 2, 3], [1, 2, 3, 3], [1, 2, 3, 3, 2], [1, 2, 3, 3, 2, 3]]

我們在這里得到的結果較少,因為對於[1, 2, 3]之外的每個遞歸調用[1, 2, 3] temp列表會立即被復制,而不會到達for循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM