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]
这些步骤如何工作吗?
答案 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])
让我们看一下输出(它是一张图片):
缩进描绘了复归深度。黑色箭头显示计算流程。红色箭头表示l
和x
彼此对应(属于同一名称空间)。从图中可以看到递归与循环有何不同。递归一直沿用到微不足道的情况,然后再上升。注意红色箭头。
因此,首先,x
永远不会3
。只是不可能。其次,l
可以是[3]
。最终的递归步骤(平凡的情况)返回了相应的x
[[]]
。这些值给您答案[[], [3]]
。这是上一个x
的{{1}}。