2024年11月6日 星期三

排列

 程式的逐步追踪解釋,並包含程式在執行過程中輸出 sub_permutations 的情況,幫助您了解遞迴如何產生排列:

程式解釋與追踪

  1. 初始呼叫 generate_permutations([1, 2, 3])

    • elements 為 [1, 2, 3]
    • 因為 len(elements) != 1,程式繼續進行遞迴
    • 初始化 all_permutations 為空列表 []
    • 進入 for 迴圈
  2. 第一層迴圈 i=0

    • 選取 elements[0] = 1
    • 計算 others = [2, 3] (即刪除選取的元素 1 後的列表)
    • 呼叫 generate_permutations([2, 3])
  3. 遞迴呼叫 generate_permutations([2, 3])

    • elements 為 [2, 3]
    • 因為 len(elements) != 1,繼續進行遞迴
    • 初始化 all_permutations 為空列表 []
    • 進入 for 迴圈
  4. 第二層迴圈 i=0

    • 選取 elements[0] = 2
    • 計算 others = [3] (刪除選取的元素 2 後的列表)
    • 呼叫 generate_permutations([3])
  5. 遞迴呼叫 generate_permutations([3])

    • elements 為 [3]
    • 因為 len(elements) == 1,回傳 [[3]]
    • 回到前一層,並且 sub_permutations = [[3]]
    • 輸出 sub_permutations = [[3]]
  6. 組合回到 generate_permutations([2, 3])

    • 取 sub_permutations = [[3]]
    • 將 [2] + [3] 加入 all_permutations,變成 all_permutations = [[2, 3]]
  7. 第二層迴圈 i=1

    • 選取 elements[1] = 3
    • 計算 others = [2] (刪除選取的元素 3 後的列表)
    • 呼叫 generate_permutations([2])
  8. 遞迴呼叫 generate_permutations([2])

    • elements 為 [2]
    • 因為 len(elements) == 1,回傳 [[2]]
    • 回到前一層,並且 sub_permutations = [[2]]
    • 輸出 sub_permutations = [[2]]
  9. 組合回到 generate_permutations([2, 3])

    • 取 sub_permutations = [[2]]
    • 將 [3] + [2] 加入 all_permutations,變成 all_permutations = [[2, 3], [3, 2]]
    • 回傳 [[2, 3], [3, 2]] 到 generate_permutations([1, 2, 3])
    • 輸出 sub_permutations = [[2, 3], [3, 2]]
  10. 組合回到 generate_permutations([1, 2, 3])

    • 取 sub_permutations = [[2, 3], [3, 2]]
    • 將 [1] + [2, 3] 和 [1] + [3, 2] 加入 all_permutations,變成 all_permutations = [[1, 2, 3], [1, 3, 2]]
  11. 第一層迴圈 i=1

    • 選取 elements[1] = 2
    • 計算 others = [1, 3]
    • 呼叫 generate_permutations([1, 3])
  12. 重複類似步驟,最終得到所有排列

    • 程式繼續以相同遞迴步驟呼叫 generate_permutations([1, 3]) 和 generate_permutations([3, 1]),最終生成所有排列並回傳。

完整輸出結果

最後,程式會回傳所有的排列:

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

總結

這段程式碼透過遞迴的方式生成所有排列,並在每一層遞迴中逐步加入選取的元素,達到排列的效果。

沒有留言:

張貼留言