为了使我的小脚本工作,我需要记住类中每个递归函数的深度。
假设我们有一个依赖列表,如下所示:
package1:
package2: package1
package3: package1 | package2
这仅仅意味着package1
取决于任何内容,package2
取决于package1
而package3
取决于package1
或 { {1}}。
我在尝试在类中实现计数器时发现了问题。
递归部分包括输入当前节点(package2
),将计数器递增1,调用前一个节点,依此类推,直到图的顶部。我需要计算深度,因为在或中我需要选择需要较少依赖的包,在本例中为self
,因为它没有依赖关系。
我尝试的是以下操作:
package1
同样但在班级以外的柜台;
class Node:
...
counter = 0
def dep_resolve(self, resolved, unresolved):
unresolved.append(self)
counter += 1
for edge in self.edges:
if edge not in resolved:
if edge in unresolved:
raise Exception('Circular')
edge.dep_resolve(resolved, unresolved)
resolved.append(self)
unresolved.remove(self)
并将计数器作为全局变量。但我仍然会遇到错误((即counter = 0
class Node:
...
))
是否有正确的方法来记住类中的依赖项?
答案 0 :(得分:1)
您可以在其他位置解决此问题。
您的包和依赖项基本上是graph,其中包是顶点,依赖项是边。
你的方法基本上是在这个图上做DFS,这很好,并且可以找到每个包的深度(虽然它不是tree - 你可能会发现一个深度不是最短的一个)。
另一种方法是设计用于找到“最短路径”(或您的情况下的最小深度),而是运行BFS。
这很容易维持BFS的当前深度,并且所有深度为k
的包将在算法中一起开发,因此使用这种方法很容易找到深度。
类似于python的BFS方法的伪代码:
q = new queue
q.add((source,0))
visited = {}
visited[source] = 1
while not q.empty():
(curr,d) = q.poll()
for each dependency (curr,next):
if next not in visited:
visited[next] = 1
q.add(next,d+1)
#the depth of next is d+1, do something with it