如何检查两个节点是否与递归函数

时间:2016-07-08 16:54:47

标签: python recursion pass-by-reference

在一次采访中,我最近被问到类似的问题,如下所示:我必须构建一个递归函数,显示两个节点是否已连接。如何使下面的代码工作?有没有办法通过引用传递a,b,c'所以当它们被实例化时,当我调用check_connection时这是有效的。 Node是一个可变对象,因此它应该像引用一样,但似乎并非如此,因为存在错误:' NoneType不可迭代'。任何建议都表示赞赏。

class Node():
    def __init__(self, neighbours):
        self.neighbours=neighbours

    def return_neighbours(self):
        return self.neighbours

def check_connection(first, second):
    connections=first.return_neighbours()
    for conection in connections:
        if second in conection:
            return True
        else:
            check_connection(conection,second)

a=None
b=None
c=None

a=Node(neighbours=[c])
b=Node(neighbours=[c])
c=Node(neighbours=[a,b])

check_connection(a,c)

2 个答案:

答案 0 :(得分:1)

问题是None不是一个可变对象。您应该将它们设置为没有邻居的节点,而不是将a,b,c设置为None。这样他们就会被随后的声明改变。正如你现在拥有的那个邻居不是c而是None,因为c只是一个指向None的变量,而不是对Node对象的引用。

答案 1 :(得分:0)

这似乎有效:

class Node():
    def __init__(self):
        self.neighbours=None

def check_connection(first, second):
    if second in first.neighbours:
        print ("Connection found")
        exit()
    else:
        for conection in first.neighbours:
            check_connection(conection,second)

a=Node()
b=Node()
c=Node()

a.neighbours=[c]
b.neighbours=[c]
c.neighbours=[a,b]

check_connection(a,c)