生成所有可能的組合,從給定的數字列表中選擇指定數量的元素,並使用回溯法來實現。以下是詳細的解釋:
程式碼逐步解釋
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位置開始,確保不會重複選擇已經處理過的元素。 - 選擇之後繼續從下一個位置遞迴探索。
- 從指定的
總結
- 回溯法: 遞迴地探索所有可能的選擇,遇到完整組合時印出結果,然後回退到上一層繼續探索其他選擇。
- 用途: 這種方法適合用來生成排列、組合、排列組合等情況,並且可以有效控制選擇過程中的重複問題。
沒有留言:
張貼留言