Python For循环在递归函数中停止迭代

Python For循环在递归函数中停止迭代,python,for-loop,recursion,directed-acyclic-graphs,Python,For Loop,Recursion,Directed Acyclic Graphs,我正在尝试使用Python2.7解决Hackerrank上的问题 我已经建立了一个字典,列出了所有的依赖项。这是字典的外观: 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)的索引 我已经尝试创建一个递归函数,该函数给定一个索引,将列出要安装的预期软件需要安装的所

我正在尝试使用Python2.7解决Hackerrank上的问题

我已经建立了一个字典,列出了所有的依赖项。这是字典的外观:

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)的索引

我已经尝试创建一个递归函数,该函数给定一个索引,将列出要安装的预期软件需要安装的所有软件。我现在不担心订单。这就是功能:

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]
我做错了什么

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

您的
for
循环将在第一次迭代时返回,因此它根本不能循环-您需要更改它,使
返回
不是循环的一部分。我的印象是,一旦我点击return,它将结束
I=1
,然后转到
I=2
。我怎么能考虑这里的所有情况?<代码>返回<代码>“退出”函数-它在循环中没有任何特殊含义。我不完全确定该函数应该做什么,但您可能希望将所有递归调用的结果存储在一个列表中(可能是
L.append(listSW(d[p][I],d,L))
?),然后在循环完成后
返回它。如果返回,则会阻止循环中的进一步调用,这就是你最终缺少依赖项的原因。只需删除
return
,它就修复了它。谢谢各位。