[英]What is the difference between these two codes of Python subset recursion function?
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]]]
我已经尝试了上面的代码,它只返回[[],[1],[2],[3]]
因此,我不小心尝试了如下一条班轮退货声明:
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]
而且有效。 我不明白在return语句中使用for循环如何使此代码起作用。 请帮助我了解它的工作原理,因为我尝试在可视化工具上运行它,但我仍然不明白。
并且,如果可以的话,可以使我的第一个代码正常工作而无需使用一个线性返回语句。
先进的百万分率
第一种情况无法返回你的预期,因为结果return
里面的语句循环。 基本上,代码将在for循环的第一次迭代中退出函数(仅累加第一个子集,然后返回结果并结束函数调用)...第二个示例对所有子集求和,然后返回结果。
第一种情况的问题是它在for循环中第一次返回。 对于第一个e,它返回然后退出循环。 要修复您的代码:
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]]
我更喜欢列表理解版本。
除了关于代码的问题之外,这是一种获取所有子集列表的方法:
(摘自: https : //wiki.python.org/moin/Powerful%20Python%20One-Liners )
这是一个工作函数,用于返回任何给定序列的所有子集的列表:
#!/python
f = lambda l: reduce(lambda z, x: z + [y + [x] for y in z], l, [[]])
...请注意,此lambda是递归定义的(就像在函数中一样)。
同样,对于n个元素,子集集的大小增长为2 ** n也毫无意义。 换句话说,对于一组10个元素,子集具有1024个元素。
考虑和建模的方式是考虑从0到2 ** n ...的所有二进制数...如果您枚举所有这样的位串并将每个位串视为要包括在其中的项的“掩码”相应的子集,您将发现您涵盖了从空集(0)到完整原始集(11111 ... 1111)的所有可能子集。
这样做的一个含义是,您可以返回序列的“第n个”“子集”,而无需枚举所有中间的“子集”(斜线引号,因为在数学上,一个集合是无序的;但是这种处理方式取决于将位字符串映射到序列。 ..在“集合”上有序处理)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.