程式的逐步追踪解釋,並包含程式在執行過程中輸出 sub_permutations
的情況,幫助您了解遞迴如何產生排列:
程式解釋與追踪
初始呼叫
generate_permutations([1, 2, 3])
elements
為[1, 2, 3]
- 因為
len(elements) != 1
,程式繼續進行遞迴 - 初始化
all_permutations
為空列表[]
- 進入
for
迴圈
第一層迴圈
i=0
- 選取
elements[0] = 1
- 計算
others = [2, 3]
(即刪除選取的元素 1 後的列表) - 呼叫
generate_permutations([2, 3])
- 選取
遞迴呼叫
generate_permutations([2, 3])
elements
為[2, 3]
- 因為
len(elements) != 1
,繼續進行遞迴 - 初始化
all_permutations
為空列表[]
- 進入
for
迴圈
第二層迴圈
i=0
- 選取
elements[0] = 2
- 計算
others = [3]
(刪除選取的元素 2 後的列表) - 呼叫
generate_permutations([3])
- 選取
遞迴呼叫
generate_permutations([3])
elements
為[3]
- 因為
len(elements) == 1
,回傳[[3]]
- 回到前一層,並且
sub_permutations = [[3]]
- 輸出
sub_permutations = [[3]]
組合回到
generate_permutations([2, 3])
- 取
sub_permutations = [[3]]
- 將
[2] + [3]
加入all_permutations
,變成all_permutations = [[2, 3]]
- 取
第二層迴圈
i=1
- 選取
elements[1] = 3
- 計算
others = [2]
(刪除選取的元素 3 後的列表) - 呼叫
generate_permutations([2])
- 選取
遞迴呼叫
generate_permutations([2])
elements
為[2]
- 因為
len(elements) == 1
,回傳[[2]]
- 回到前一層,並且
sub_permutations = [[2]]
- 輸出
sub_permutations = [[2]]
組合回到
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]]
- 取
組合回到
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]]
- 取
第一層迴圈
i=1
- 選取
elements[1] = 2
- 計算
others = [1, 3]
- 呼叫
generate_permutations([1, 3])
- 選取
重複類似步驟,最終得到所有排列
- 程式繼續以相同遞迴步驟呼叫
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]]
總結
這段程式碼透過遞迴的方式生成所有排列,並在每一層遞迴中逐步加入選取的元素,達到排列的效果。
沒有留言:
張貼留言