數學基礎:二、組合算法(遞歸)

組合算法也是使用遞歸算法產生組合結果

public class Lesson8_1 {
    /**
     * @Description 組合算法
     * @param has 已經選中要組合的數據
     * @param rest 剩餘未(待)組合的數據
     * @param n 要選出的個數
     * @param resultList 組合結果
     */
    public static void combine(List<String> has, List<String> rest, int n, List<List<String>> resultList) {
        // 已達到選中的數量,直接添加到結果集中
        if (has.size() == n) {
            resultList.add(has);
        } else {
            int size = rest.size();
            for (int i = 0; i < size; i++) {
                // 爲了不破壞遞歸前的原數據,設置臨時變量tmpHas和tmpRest來保存中間值
                List<String> tmpHas = new ArrayList<>(has);
                // 從遍歷的待組合數據中,取出一條數據作爲組合的一個值
                tmpHas.add(rest.get(i));
                // 新的待組合結果只從選中後的數據中找,往前找只會和之前a, b或b, a這種重複
                List<String> tmpRest = new ArrayList<>(rest.subList(i + 1, size));
                // 遞歸調用,剩餘待組合數據繼續生成組合值
                combine(tmpHas, tmpRest, n, resultList);
            }
        }
    }

    public static void main(String[] args) {
        String[] arr = {"1", "2", "3", "4", "5"};
        List<String> restList = Arrays.asList(arr);
        List<List<String>> resultList = new ArrayList<>();
        combine(new ArrayList<>(), restList, 3, resultList);
        System.out.println(resultList);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章