首页 > 解决方案 > 参考以下代码,返回如何以递归方式工作

问题描述

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)在这些returns中,我认为它会添加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]这些步骤是如何工作的?

标签: pythonrecursion

解决方案


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

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])

让我们看看输出(它是一个图像):

在此处输入图像描述

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

所以,首先,x是从来没有3。实际上不可能。二、l可以[3]。相应x[[]]由最后的递归步骤(平凡的情况)返回。这些数值给你答案[[], [3]]。这是x针对以前的l = [2, 3].


推荐阅读