def powerset(seq):
"""
Returns all the subsets of this set. This is a generator.
"""
if len(seq) <= 1:
yield seq
yield []
else:
for item in powerset(seq[1:]):
yield [seq[0]]+item
yield item
上面是一个递归生成器,可以生成所有的功率集。例如
powerset([1,2,3])=>[1, 2, 3][2, 3][1, 3][3][1, 2][2][1][]
但我对它的工作原理感到困惑。它似乎是这样屈服的:
powerset([1,2,3])=>powerset([2,3])=>powerset([3])
它是outside=>;inside,与“recursive”在我的理解中的意思相反,inside=>;outside,例如递归求解阶乘(5):
factorial has been called with n = 5
factorial has been called with n = 4
factorial has been called with n = 3
factorial has been called with n = 2
factorial has been called with n = 1
intermediate result for 2 * factorial( 1 ): 2
intermediate result for 3 * factorial( 2 ): 6
intermediate result for 4 * factorial( 3 ): 24
intermediate result for 5 * factorial( 4 ): 120
120
那么如何理解递归生成器呢?你知道吗
基本上,生成器实现了一个回溯算法:在到达任何
yield
之前,已经进行了许多递归调用。只有当递归嵌套的深度足够使剩余列表的长度为1时,才会执行程序文本中首先出现的yield
调用,并且只有在嵌套深度足够使剩余列表的长度为1之后才会进入for
循环,因为这需要最内部的生成器生成某些内容。你知道吗只有通过
for
循环的最后一行“冒泡”,最里面生成的短序列才会出现在最外面调用的输出中。在达到这一点之前,产生与seq[0]
的组合。你知道吗如果您想以另一种方式获得输出,请尝试交换循环中的两行
yield
。你知道吗让我们看看:
这是递归部分:
基本上这意味着
如果我们看powerset([3]),它首先返回[3],然后返回[],因为它的长度是1
powerset([2,3])调用powerset([3]),然后执行以下操作:
这导致
[2,3] [3] [2] []
如果我们调用powerset([1,2,3]),同样的事情也会发生
相关问题 更多 >
编程相关推荐