現實問題:測試多個參數不同的組合情況對結果的影響
算法示例:
輸入: A,B,C,D
輸出:
A
A,B
A,B,C
A,B,C,D
A,C
A,C,D
A,D
B
B,C
B,C,D
B,D
C
C,D
D
算法實現邏輯:
對於每個元素來說,所做的工作就是要找到該元素能夠組合的情況,所以這里直接遞歸尋找每個元素的組合。
由於這里不需要加上排列條件,按順序從前往后找就不會有重復的情況了。
代碼:
static void Main(string[] args) { var xcolnames = new List < string > { "A", "B", "C", "D"}; var paramGroup = new List<string>(); for (var i = 0; i < xcolnames.Count; i++) { paramGroup.Add(xcolnames[i]); Console.WriteLine(xcolnames[i]); FindPartner(i, new List<string>(), xcolnames, ref paramGroup); } } private static void FindPartner(int self, List<string> head, List<string> data, ref List<string> result) { for (var i = self + 1; i < data.Count; i++) { //找到就加入並輸出 var cresult = new List<string>(head.ToArray()); cresult.Add(data[self]); cresult.Add(data[i]); result.Add(string.Join("+", cresult)); Console.WriteLine(string.Join("+", cresult)); //克隆之前的搭檔 var headclone = new List<string>(head.ToArray()); headclone.Add(data[self]); FindPartner(i, headclone, data, ref result); } }