小编典典
您需要电源。这里是所有StackOverflow上提及的问题powersets或发电机组。
这是python中的基本实现:
def powerset(s):
n = len(s)
masks = [1<
for i in xrange(2**n):
yield [s[j] for j in range(n) if (masks[j] & i)]
if __name__ == '__main__':
for elem in powerset([1,2,3,4,5]):
print elem
这是它的输出:
[]
[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]
[4]
[1, 4]
[2, 4]
[1, 2, 4]
[3, 4]
[1, 3, 4]
[2, 3, 4]
[1, 2, 3, 4]
[5]
[1, 5]
[2, 5]
[1, 2, 5]
[3, 5]
[1, 3, 5]
[2, 3, 5]
[1, 2, 3, 5]
[4, 5]
[1, 4, 5]
[2, 4, 5]
[1, 2, 4, 5]
[3, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
[1, 2, 3, 4, 5]
请注意,它的第一个结果是空集。从这个迭代改变for i in xrange(2**n):这个for i in xrange(1,
2**n):,如果你想跳过一个空集。
这是适用于产生字符串输出的代码:
def powerset(s):
n = len(s)
masks = [1<
for i in xrange(2**n):
yield "".join([str(s[j]) for j in range(n) if (masks[j] & i)])
编辑2009-10-24
好的,我知道您只是部分Java实现。我不懂Java,所以我会和您见面并用C#给您代码:
static public IEnumerable> powerset(IList s)
{
int n = s.Count;
int[] masks = new int[n];
for (int i = 0; i < n; i++)
masks[i] = (1 << i);
for (int i = 0; i < (1 << n); i++)
{
List newList = new List(n);
for (int j = 0; j < n; j++)
if ((masks[j] & i) != 0)
newList.Add(s[j]);
yield return newList;
}
}
2020-07-28