参考以下代码,递归如何工作

时间:2019-03-12 03:27:23

标签: python recursion

def subs(l):
    if l == []:
        return [[]]

    x = subs(l[1:])

    return x + [[l[0]] + y for y in x]

1)我试图理解上述代码的工作方式

2)如果在递归结束时l = [1,2,3],我们将获得一个空列表清单

3)在最后的下一次迭代中,我们将得到x的结果为3 (我认为它将进行下一步,即return

4)在这些return中,我认为它将添加return x + [[l[0]] + y for y in x]应该返回(3,3)

5)完成这些步骤后,答案应为(3,3)

根据第二步的最终答案必须为[[],[3,3]]

但是代码正在打印不同的答案。

o/p 

[], [3]]

任何人都可以解释我的假设在哪里出错以及return x + [[l[0]] + y for y in x]这些步骤如何工作吗?

1 个答案:

答案 0 :(得分:1)

我对代码进行了一些修改,以使其打印出中间结果:

def subs(l, num=0):

    print(' ' * num, 'current l is:', l)
    print()

    if l == []:
        return [[]]

    x = subs(l[1:], num + 4)
    print(' ' * num, 'current x is:', x)

    answer = x + [[l[0]] + y for y in x]
    print(' ' * num, 'current answer is:', answer)

    print()

    return answer

subs([1, 2, 3])

让我们看一下输出(它是一张图片):

enter image description here

缩进描绘了复归深度。黑色箭头显示计算流程。红色箭头表示lx彼此对应(属于同一名称空间)。从图中可以看到递归与循环有何不同。递归一直沿用到微不足道的情况,然后再上升。注意红色箭头。

因此,首先,x永远不会3。只是不可能。其次,l可以是[3]。最终的递归步骤(平凡的情况)返回了相应的x [[]]。这些值给您答案[[], [3]]。这是上一个x的{​​{1}}。