程式的逐步追踪解釋,並包含程式在執行過程中輸出 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]]
總結
這段程式碼透過遞迴的方式生成所有排列,並在每一層遞迴中逐步加入選取的元素,達到排列的效果。
沒有留言:
張貼留言