現實問題:測試多個參數不同的組合情況對結果的影響
算法示例:
輸入: 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);
}
}
