Python中的递归堆栈

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)

有些人可以帮助我理解带有sa值的调用堆栈流吗?

Boo*_*boo 1

当您最初调用时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]包含列表内。