繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM