我刚开始学习递归,我有一个编写程序的任务,该程序告诉列表的嵌套深度。好吧,我浏览了周围并找到了工作代码来做到这一点,但我仍然无法理解它是如何工作的。这是代码:
def depth(L) :
nesting = []
for c in L:
if type(c) == type(nesting) :
nesting.append(depth(c))
if len(nesting) > 0:
return 1 + max(nesting)
return 1
很自然地,我开始对调用递归的追加行感到困惑。有没有人有一个简单的方法来解释这里发生了什么?我不确定实际上附加了什么,并且在我脑海中用测试用例进行测试并没有帮助。谢谢!
编辑:抱歉,如果格式不佳,我从手机输入了
答案 0 :(得分:2)
让我以简单的方式向您展示,更改代码如下: (###是我添加到您的代码中的新行,以便您可以观察那里发生的事情)
def depth(L) :
nesting = []
for c in L:
if type(c) == type(nesting) :
print 'nesting before append', nesting ###
nesting.append(depth(c))
print 'nesting after append', nesting ###
if len(nesting) > 0:
return 1 + max(nesting)
return 1
现在让我们制作一个深度为3的列表:
l=[[1,2,3],[1,2,[4]],'asdfg']
你可以看到我们的列表有3个元素。其中一个是列表,另一个列表本身有另一个列表,最后一个是字符串。你可以清楚地看到这个列表的深度是3(即主列表的第二个元素中有2个嵌套在一起的列表)
让我们运行这段代码:
>>> depth(l)
nesting before append []
nesting after append [1]
nesting before append [1]
nesting before append []
nesting after append [1]
nesting after append [1, 2]
3
一块蛋糕!此函数将1添加到嵌套中。那么如果元素还有另一个列表,它会在嵌套中追加1 +最大数,这是函数自身被调用的次数。如果元素是一个字符串,它会跳过它。
最后,它返回嵌套中的最大数,这是递归发生的最大次数,即主列表中列表内部列表的时间,即深度。在我们的例子中,递归发生了两次,第二个元素+ 1 = 3,正如我们预期的那样。
如果您仍然遇到问题,请尝试向该函数添加更多print
语句或其他变量,并仔细观察它们,最终您将获得它。
答案 1 :(得分:1)
所以这看起来像是一个函数,它接受一个列表并计算它的嵌套深度。嵌套是一个列表,所以if type(c) == type(nesting)
所说的是:如果列表L
中的项是一个列表,再次运行该函数并追加它,当它再次运行该函数时,它将执行相同的操作测试直到列表L
中没有更多嵌套列表,然后返回1 +嵌套列表的最大数量,因为每个列表的深度为1。
如果有任何不清楚的地方,请告诉我
答案 2 :(得分:1)
让我们从几个例子开始。
首先,让我们考虑一个只有一个深度级别的列表。例如,[1, 2, 3]
。
在上面的列表中,代码首先调用depth()
L = [1, 2, 3]
。它会创建一个空列表nesting
。迭代L
的所有元素,即1, 2, 3
,并且没有找到通过测试type(c) == type(nesting)
的单个元素。检查len(nesting) > 0
失败并且代码返回1,这是列表的深度。
接下来,让我们举一个深度为2的例子,即[[1, 2], 3]
。使用depth()
调用函数L = [[1, 2], 3]
,并创建空列表nesting
。循环遍历L的2个元素,即[1, 2] , 3
,因为type([1, 2]) == type(nesting)
,nesting.append(depth(c))
被调用。与前一个示例类似,depth(c)
即depth([1, 2])
返回1,nesting
现在变为[1]
。执行循环后,代码将评估测试len(nesting) > 0
,结果为True
,并返回1 + max(nesting)
1 + 1 = 2
。
类似地,代码遵循深度3,依此类推。
希望这有用。
答案 3 :(得分:0)
此算法访问嵌套列表,并为每个递归级别添加一个。调用链是这样的:
depth([1, 2, [3, [4, 5], 6], 7]) =
1 + depth([3, [4, 5], 6]) = 3
1 + depth([4, 5]) = 2
1
由于深度([4,5])从不进入if type(c) == type(nesting)
条件,因为没有元素是一个列表,它从外部返回返回1,这是基本情况。
对于给定深度,您有多个嵌套列表,例如[1, [2, 3], [4, [5, 6]]
,[2,3]
和[4, [5, 6]]
的最大深度都附加在深度调用上,其中max由内部返回返回。