for循环停止迭代递归函数

时间:2017-03-26 20:41:39

标签: python for-loop recursion directed-acyclic-graphs

我正在尝试使用Python 2.7解决Hackerrank上的dependency hell问题。

我已经形成了一个列出所有依赖项的字典。这就是字典的样子:

d = {1: [1, 8], 2: [0], 3: [1, 7], 4: [1, 7], 5: [1, 2], 6: [1, 2], 7: [0], 8: [2, 3, 4]}

每个列表中的第一个数字只是该列表中的元素数。接下来的数字是依赖项的索引。每个数字是软件的索引(即软件#1)。

我尝试创建一个给定索引的递归函数,列出需要安装的所有SW,以便安装预期的SW。我此刻并不担心订单。这是功能:

def listSW(p,d,L):
    L.append(p)
    if d[p][0] > 0:
        for i in xrange(1,d[p][0]+1):
            return listSW(d[p][i],d,L)
    else:
        return L

其中L是一个列表(最初为空),我将转储所有需要安装的索引,p是我们打算安装的软件。

问题是在for循环中只考虑了i = 1。因此,如果我运行p = 8的函数,我会得到:

[8, 3, 7]

当我打算得到:

[8, 3, 7, 4, 7]

我做错了什么?

1 个答案:

答案 0 :(得分:1)

def listSW(p,d,L):
    L.append(p)
    if d[p][0] > 0:
        for i in xrange(1,d[p][0]+1):
            listSW(d[p][i],d,L)
    return L

但我不喜欢混合返回和更新列表,所以我会这样做:

def buildList(p,d,L=[]):
    def patchList(p,d,L):
        L.append(p)
        for i in d[p][1:]:
            patchList(i,d,L)
    patchList(p,d,L)
    return L