Python子集递归函数的这两个代码有什么区别?

Python子集递归函数的这两个代码有什么区别?,python,recursion,set,Python,Recursion,Set,我试过上面的代码,它只返回[[]、[1]、[2]、[3]] 因此,我无意中尝试了一行返回语句,如下所示: def all_subsets(s): if len(s) == 1: return [[], s] else: sets = all_subsets(s[:-1]) for e in sets: return sets + [e + [s[-1]]] 它成功了。我不明白在return语句中使用for循环是如何使代码工

我试过上面的代码,它只返回[[]、[1]、[2]、[3]]

因此,我无意中尝试了一行返回语句,如下所示:

def all_subsets(s):
    if len(s) == 1: return [[], s]
    else:
        sets = all_subsets(s[:-1])
        for e in sets:
            return sets + [e + [s[-1]]]
它成功了。我不明白在return语句中使用for循环是如何使代码工作的;请帮助我了解它是如何工作的,因为我已经尝试在可视化工具上运行它,但我仍然不明白

如果可能的话,请允许我的第一个代码不使用一行返回语句而工作


由于for循环中的
return
语句,第一个案例未能返回您期望的结果。基本上,代码将在for循环的第一次迭代中退出函数(仅对第一个子集求和,然后返回结果并结束函数调用)。。。第二个示例对所有子集求和,然后返回结果。

第一种情况下的问题是它返回for循环中的第一次。对于第一个e,它返回,然后退出循环。要修复代码,请执行以下操作:

def all_subsets(s):
    if len(s) == 1: return [[], s]
    else:
        sets = all_subsets(s[:-1])
        return sets + [e + [s[-1]] for e in sets]

不过,我更喜欢列表理解版。

除了关于代码的问题之外,还有一种方法可以获得所有子集的列表:

(发件人:)

下面是一个工作函数,用于返回任意给定序列的所有子集的列表:

def all_subsets(s):
    if len(s) == 1: return [[], s]
    else:
        sets = all_subsets(s[:-1])
        returnset = []
        for e in sets:
            returnset.extend([e,e + [s[-1]]])
        return returnset

s= [1,2,3]
print all_subsets(s)

[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
。。。注意,这个lambda是递归定义的(就像在函数中一样)

此外,对于n个元素,子集集的大小增长为2**n也不值得。换句话说,对于10个元素的集合,子集集合有1024个元素

什么样的思维方式和建模是考虑所有的二进制数从0到2 **…如果你枚举所有这样的位串,并认为每一个都是一个“掩码”,其中包含在相应子集中的项目,那么你会发现你已经通过完整的原始集合(11111…1111)覆盖了空集(0)的所有可能子集。
其中一个含义是,您可以返回序列的“n”个“子集”,而无需枚举所有中间的“子集”(因为集合在数学上是无序的,所以用短引号括起来;但这种处理依赖于将位字符串映射到序列……在有序处理的“集合”上).

您只是误解了列表的理解。
return[x代表y中的x]
的等价物是
ret=[];对于y中的x:ret.append(x);return ret
Note-我刚刚通过将两个
append
调用更改为一个
extend
#!/python
f = lambda l: reduce(lambda z, x: z + [y + [x] for y in z], l, [[]])