2024年10月18日 星期五

回溯法IV: 生成所有可能的組合

 生成所有可能的組合,從給定的數字列表中選擇指定數量的元素,並使用回溯法來實現。以下是詳細的解釋:

程式碼逐步解釋

  1. 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,確保後續的元素不會重複選擇。
  2. 主程式的 for 迴圈:

    for k in range(1, 4):
        combine([1, 2, 3, 4], k, [], 0)
    
    • 目標: 遍歷 k 的值來測試不同長度的組合。
    • k 從 1 到 3,分別生成長度為 1、2 和 3 的組合。
    • 對於每個 k,呼叫 combine 來生成並印出結果,之間會有空行分隔不同的結果。

執行結果解釋

  1. 當 k = 1

    [1]
    [2]
    [3]
    [4]
    
    • 所有長度為 1 的組合。
  2. 當 k = 2

    [1, 2]
    [1, 3]
    [1, 4]
    [2, 3]
    [2, 4]
    [3, 4]
    
    • 所有長度為 2 的組合。
  3. 當 k = 3

    [1, 2, 3]
    [1, 2, 4]
    [1, 3, 4]
    [2, 3, 4]
    
    • 所有長度為 3 的組合。

程式運作流程

  1. 回溯法的核心:

    • 程式從一個空的 path 開始,逐步向其中加入元素。
    • 每當 path 達到指定長度 n,便會印出並結束當前遞迴分支。
    • 程式會自動回溯到上一層,嘗試其他選擇,直到遍歷所有可能的組合。
  2. for 迴圈的作用:

    • 從指定的 start 位置開始,確保不會重複選擇已經處理過的元素。
    • 選擇之後繼續從下一個位置遞迴探索。

總結

  • 回溯法: 遞迴地探索所有可能的選擇,遇到完整組合時印出結果,然後回退到上一層繼續探索其他選擇。
  • 用途: 這種方法適合用來生成排列、組合、排列組合等情況,並且可以有效控制選擇過程中的重複問題。

沒有留言:

張貼留言