擅长:python、mysql、java
<p>你的想法是对的。如果<code>a</code>是非空的,那么<code>a</code>的功率集可以通过从<code>a</code>获取一些元素<code>s</code>来形成,我们称之为<code>rest</code>。然后从<code>rest</code>的powerset中构建<code>s</code>的powerset,方法是对<code>powerset3(rest)</code>中的每个<code>subset</code>本身和<code>subset | frozenset({s})</code>进行相加。在</p>
<p>最后一点,使用<code>subset | frozenset({s})</code>而不是字符串连接,这是解决方案缺少的一半。另一个问题是基本情况。元素集的集合不是空的。在</p>
<p>解决方案的另一个问题是,您试图以可变的方式使用<code>frozenset</code>,它是不可变的(例如<code>pop()</code>,<code>b |= something</code>,等等)</p>
<p>这里有一个可行的解决方案:</p>
<pre><code>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))
</code></pre>