穷举所有排列情况算法实现

现实问题:测试多个参数不同的组合情况对结果的影响

算法示例:

输入: 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);
  }
}

  

原文地址:https://www.cnblogs.com/lycnblogs/p/9111565.html