python - 参考以下代码,返回如何以递归方式工作
问题描述
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
s中,我认为它会添加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]
这些步骤是如何工作的?
解决方案
我对代码进行了一些修改以使其打印中间结果:
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
针对以前的l = [2, 3]
.
推荐阅读
- html - 书面边框与显示边框
- javascript - 更改具有相同类名的某些 div 的样式
- asp.net-core - 我可以添加 https://www.tiny.cloud/docs/quick-start/ 从我们的本地服务器加载吗
- mysql - 按固定类别选择最高结果,其余为其他
- python - 无法确定关系上的父/子表之间的连接条件
- c# - 如何在 Visual Studio 中禁用快速操作?
- jquery - 第二个 Jquery 脚本没有从加载的 php 结果的选择中执行
- javascript - 创建一个接受整数并生成包含整数对的数组的函数 [a, b] 按 a 和 b 的递增值排序
- python - 错误:恢复损坏文件时无法找到预告片字典
- c# - IIS - 如何在我网站的不同部分提供“服务质量”