【发布时间】:2016-05-22 02:23:33
【问题描述】:
我编写了一个名为size_subsets 的函数,当传递一个城市列表(数字)时,它返回一定大小的所有子集。但是,使用 izip() 而不是两个 for-yield 块来重述函数会完全破坏这种行为。
下面的第二种方法使用izip() 重述第一种方法,但由于某种原因,它在顶层没有返回任何内容。谁能帮我弄清楚这是为什么?
打印语句显示,在size_subsets_broken 中递归的最底层确实产生了一些(不是全部)正确子集,但由于某种原因,即使这些子集也没有进入顶层。
def size_subsets(cities, size, sofar):
if not size:
yield sofar
return
elif len(cities) < size:
return
else:
curr_city = cities.pop()
for a in size_subsets(cities[:], size - 1, sofar | {curr_city}):
yield a
for b in size_subsets(cities[:], size, sofar):
yield b
def size_subsets_broken(cities, size, sofar):
if not size:
yield sofar
return
elif len(cities) < size:
return
else:
curr_city = cities.pop()
inclusive = size_subsets_broken(cities[:], size - 1, sofar | {curr_city})
exclusive = size_subsets_broken(cities[:], size, sofar)
for incl_subset, excl_subset in izip(inclusive, exclusive):
yield incl_subset
yield excl_subset
print list(size_subsets([1, 2, 3], 2, set())) # [set([2, 3]), set([1, 3]), set([1, 2])]
print list(size_subsets_broken([1, 2, 3], 2, set())) # []
【问题讨论】:
-
您的第一个方法产生所有
a值,然后是所有b值。您的第二种方法在它们之间交替。你想要吗?
标签: python recursion generator subset