生成所有可能的組合,從給定的數字列表中選擇指定數量的元素,並使用回溯法來實現。以下是詳細的解釋:
程式碼逐步解釋
combine(nums, n, path, start)
函式:def combine(nums, n, path, start): if len(path) == n: print(path) return for i in range(start, len(nums)): combine(nums, n, path + [nums[i]], i + 1)
目標: 從
nums
中選出長度為n
的所有組合。參數解釋:
nums
: 給定的數字列表(例如[1, 2, 3, 4]
)。n
: 目標組合的長度。path
: 當前正在構建的組合(初始化為空列表[]
)。start
: 控制從哪個位置開始選擇元素,防止重複選擇。
遞迴終止條件:
- 當
path
的長度等於n
時,表示找到了一個完整的組合,將其印出並返回。
- 當
遞迴流程:
- 使用
for
迴圈從start
到len(nums)
遍歷nums
。 - 將
nums[i]
加入到path
中,並遞迴地呼叫combine
,讓start
設為i + 1
,確保後續的元素不會重複選擇。
- 使用
主程式的
for
迴圈:for k in range(1, 4): combine([1, 2, 3, 4], k, [], 0)
- 目標: 遍歷
k
的值來測試不同長度的組合。 k
從1
到3
,分別生成長度為 1、2 和 3 的組合。- 對於每個
k
,呼叫combine
來生成並印出結果,之間會有空行分隔不同的結果。
- 目標: 遍歷
執行結果解釋
當
k = 1
:[1] [2] [3] [4]
- 所有長度為 1 的組合。
當
k = 2
:[1, 2] [1, 3] [1, 4] [2, 3] [2, 4] [3, 4]
- 所有長度為 2 的組合。
當
k = 3
:[1, 2, 3] [1, 2, 4] [1, 3, 4] [2, 3, 4]
- 所有長度為 3 的組合。
程式運作流程
回溯法的核心:
- 程式從一個空的
path
開始,逐步向其中加入元素。 - 每當
path
達到指定長度n
,便會印出並結束當前遞迴分支。 - 程式會自動回溯到上一層,嘗試其他選擇,直到遍歷所有可能的組合。
- 程式從一個空的
for
迴圈的作用:- 從指定的
start
位置開始,確保不會重複選擇已經處理過的元素。 - 選擇之後繼續從下一個位置遞迴探索。
- 從指定的
總結
- 回溯法: 遞迴地探索所有可能的選擇,遇到完整組合時印出結果,然後回退到上一層繼續探索其他選擇。
- 用途: 這種方法適合用來生成排列、組合、排列組合等情況,並且可以有效控制選擇過程中的重複問題。
沒有留言:
張貼留言