无法理解这段代码

时间:2013-04-24 17:04:21

标签: python recursion nested depth

我刚开始学习递归,我有一个编写程序的任务,该程序告诉列表的嵌套深度。好吧,我浏览了周围并找到了工作代码来做到这一点,但我仍然无法理解它是如何工作的。这是代码:

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

很自然地,我开始对调用递归的追加行感到困惑。有没有人有一个简单的方法来解释这里发生了什么?我不确定实际上附加了什么,并且在我脑海中用测试用例进行测试并没有帮助。谢谢!

编辑:抱歉,如果格式不佳,我从手机输入了

4 个答案:

答案 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由内部返回返回。