算法思想:集合中的某个元素,要么在子集中,要么不在子集中;
每次从集合中取一个元素,将该元素放在子集中,继续取元素直到集合尾部;
将该元素从子集中删除,继续取元素知道集合尾部;
在到达集合尾部时,输出子集中的元素。
C#实现:
/// <summary>
/// 求集合的所有子集
/// </summary>
/// <param name="a">集合</param>
/// <param name="i">已对集合中的第i-1个元素取舍</param>
/// <param name="n">集合元素的个数</param>
/// <param name="b">临时集合,用来输出子集</param>
void PowerSet(int[] a,int i,int n,List<int> b)
{
if(i>n) //到达集合尾部输出子集元素
{
Console.Write(" { ");
for (int j = 0; j < b.Count;j++ )
{
if(j < (b.Count - 1))
Console.Write(b[j] + " , ");
else
Console.Write(b[j] + " } ");
}
if(b.Count==0)
{
Console.Write(" } ");
}
Console.WriteLine();
}
else
{
int x = a[i-1];
b.Add(x); //取
PowerSet(a, i + 1, n, b);
b.Remove(x); //舍
PowerSet(a, i + 1, n, b);
}
}