假设我们有休闲类'X','Y','Z',所以我需要的结果是这样的
(X),(X,Y),(X,Z),(X,Y,Z),(Y),(Y,Z),(Z)
如果我们有'X','Y','Z','J',那么我需要的结果是这样的
(X), (X,Y),(X,Z),(X,J), (Y), (Y,Z),(Y,J), (Z),(Z,J)
(X,Y,Z), (X,Y,Z,J), (Y,Z,J), (Z,J,X)
我需要什么算法来完成这个?
您正在寻找的东西称为电源组。有递归和迭代两种方法来计算它;google 一下应该不难。
尝试实施算法,如果遇到具体问题,请回来更新问题。
如果那是幂集,您就错过了空集(当然,它始终是幂集的成员!)。
无论如何,这样的事情可能对你有用:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
class Program
{
static void Main()
{
string[] classes = {"X", "Y", "Z"};
foreach (var combination in PowerSet(classes))
{
foreach (var item in combination)
{
Console.Write(item + ", ");
}
Console.WriteLine("");
}
}
public static IEnumerable<IEnumerable<T>> PowerSet<T>(T[] sequence)
{
return from m in Enumerable.Range(0, 1 << sequence.Length)
select
from i in Enumerable.Range(0, sequence.Length)
where (m & (1 << i)) != 0
select sequence[i];
}
}
}
该算法通过“假装”组合是二进制数来工作。有关详细信息,请参阅http://en.wikipedia.org/wiki/Power_set(尤其是标题为“将子集表示为函数”的部分)。