我刚刚写了一个小型的递归程序来生成列表的所有可能子集。
def subdivisions(ls):
yield [ls]
if len(ls) > 1:
for i in range(1, len(ls)):
for lhs in subdivisions(ls[:i]):
yield lhs + [ls[i:]]
>>> for x in subdivisions('abcd'): print x
...
['abcd']
['a', 'bcd']
['ab', 'cd']
['a', 'b', 'cd']
['abc', 'd']
['a', 'bc', 'd']
['ab', 'c', 'd']
['a', 'b', 'c', 'd']
我已经使用暴力方法破解了这个问题,花费了很长时间来弄清楚。我想知道这被称为什么,因为我相信它有一个名称。
总的来说,我想知道如何从数学角度学习这些内容,以及是否有良好的著名编程库涵盖了像这样的有用算法(我知道https://docs.python.org/3/library/itertools.html)。
[编辑] 这被标记为重复的问题 - get all possible partitions of a set - 有不同的答案。
它正在寻找
{{{1,2,3},{}} , {{1},{2,3}} , {{1,2},{3}} , {{1,3},{2}}, {{1},{2},{3}}}
而对于我来说(在它的术语中),一个正确的答案将是{{{1,2,3}} , {{1},{2,3}} , {{1,2},{3}} , {{1},{2},{3}}}
此外,问这个问题的目的是弄清楚这个术语是什么; 我称其为“分区”; 那个答案称其为“划分”。我正在寻找一个良好的资源,列举所有这些模式,以便人们不必重新发明轮子。