【发布时间】:2016-03-03 20:22:43
【问题描述】:
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])
which is outside=>inside,与我理解的“递归”含义相反,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
那么如何理解递归生成器呢?
【问题讨论】:
-
递归意味着调用自身。
powerset在自身内部调用powerset,所以它是递归的。 -
@zondo 是的,我很困惑的是,为什么首先调用最外面的产量?
-
具有递归功能的函数像
stack一样工作,所以第一个调用将最后输出 -
对于您的示例,产生的第一件事是
[1]+ 产生的第一件事是powerset([2, 3])。powerset([2, 3])首先产生[2]+powerset([3])。到目前为止,我们的第一个收益是[1] + [2] + powerset([3])。这可以简化为[1, 2] + powerset([3])。powerset([3])首先产生[3],因为len(seq) <= 1。因此,产生的第一件事是[1, 2, 3]。 -
@zondo 那么 powerset([3]) 会被调用几次吗?
标签: python recursion generator