记住班级

时间:2015-05-27 08:09:14

标签: algorithm class python-3.x recursion depth

为了使我的小脚本工作,我需要记住类中每个递归函数的深度。

假设我们有一个依赖列表,如下所示:

package1:
package2: package1
package3: package1 | package2

这仅仅意味着package1取决于任何内容,package2取决于package1package3取决于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: ... ))

是否有正确的方法来记住类中的依赖项?

1 个答案:

答案 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