組合算法也是使用遞歸算法產生組合結果
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);
}
}