现实问题:测试多个参数不同的组合情况对结果的影响
算法示例:
输入: 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);
}
}