我在这里坐了将近5个小时试图解决问题,现在我希望得到你的帮助。
这是我的Python代码:
def powerset3(a):
if (len(a) == 0):
return frozenset({})
else:
s=a.pop()
b=frozenset({})
b|=frozenset({})
b|=frozenset({s})
for subset in powerset3(a):
b|=frozenset({str(subset)})
b|=frozenset({s+subset})
return b
如果我运行程序:
print(powerset3(set(['a', 'b'])))
我得到以下解决方案
frozenset({'a', 'b', 'ab'})
但我想要
{frozenset(), frozenset({'a'}), frozenset({'b'}), frozenset({'b', 'a'})}
我不想使用库,它应该是递归的!
感谢您的帮助
答案 0 :(得分:1)
这是使用itertools
稍微更具可读性的实现,如果您不想使用lib进行组合,则可以将组合代码替换为其实现,例如:来自https://docs.python.org/2/library/itertools.html#itertools.combinations
def powerset(l):
result = [()]
for i in range(len(l)):
result += itertools.combinations(l, i+1)
return frozenset([frozenset(x) for x in result])
测试IPython,长度不同
In [82]: powerset(['a', 'b'])
Out[82]:
frozenset({frozenset(),
frozenset({'b'}),
frozenset({'a'}),
frozenset({'a', 'b'})})
In [83]: powerset(['x', 'y', 'z'])
Out[83]:
frozenset({frozenset(),
frozenset({'x'}),
frozenset({'x', 'z'}),
frozenset({'y'}),
frozenset({'x', 'y'}),
frozenset({'z'}),
frozenset({'y', 'z'}),
frozenset({'x', 'y', 'z'})})
In [84]: powerset([])
Out[84]: frozenset({frozenset()})
答案 1 :(得分:0)
你有正确的想法。如果a
非空,那么可以通过从a
获取一些元素s
来形成a
的powerset,并让我们调用rest
上剩下的内容。然后在s
rest
本身subset
powerset3(rest)
subset
中为每个subset | frozenset({s})
添加subset | frozenset({s})
的{{1}}版本frozenset
。 }。
最后一点,执行pop()
而不是字符串连接是解决方案所缺少的一半。另一个问题是基本情况。空集的powerset是不空集,是包含空集的一个元素的集合。
您的解决方案的另一个问题是,您尝试以可变的方式使用b |= something
,这是不可变的(例如from functools import partial
def helper(x, accum, subset):
return accum | frozenset({subset}) | frozenset({frozenset({x}) | subset})
def powerset(xs):
if len(xs) == 0:
return frozenset({frozenset({})})
else:
# this loop is the only way to access elements in frozenset, notice
# it always returns out of the first iteration
for x in xs:
return reduce(partial(helper, x), powerset(xs - frozenset({x})), frozenset({}))
a = frozenset({'a', 'b'})
print(powerset(a))
,{{1}}等。)
这是一个有效的解决方案:
{{1}}