Ram*_*mu 5 python recursion callstack
我正在尝试了解以下 python 递归函数的调用堆栈。该函数给出给定集合的所有组合。
def subsets(A):
if not A:
yield []
else:
for s in subsets(A[1:]):
yield s
yield [A[0]] + s
l1=[1,2,3]
print(list(subsets(l1)))
Run Code Online (Sandbox Code Playgroud)
该程序正在根据需要生成输出:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
但是我无法可视化调用堆栈。它怎么能打印[1,2,3]
?我的理解如下
call stack 1 : values are : for s in [2,3], a[0] = 1, a = [1,2,3]
call stack 2 : values are : for s in [3], a[0] = 2, a = [2,3]
call stack 3 : values are : for s in [], a[0] = 3, a = [3]
Run Code Online (Sandbox Code Playgroud)
有些人可以帮助我理解带有s
和a
值的调用堆栈流吗?
当您最初调用时susbsets
,参数A
是[1, 2, 3]
。需要注意的重要一点是,该函数将递归地使用参数 反复调用自身[2, 3]
,[3]
并且[]
在开始为当前参数 生成值之前[1, 2, 3]
。然后所有这些递归调用返回,我们执行以下A
具有值的代码[1, 2, 3]
:
for s in subsets(A[1:]):
yield s # produces [2, 3]
yield [A[0]] + s # produces [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
因此,我们期望生成的最后两个值位于[2, 3], [1, 2, 3]
包含列表内。