【问题标题】:How to check if two nodes are connected with recursive function如何检查两个节点是否通过递归函数连接
【发布时间】:2016-11-11 08:02:02
【问题描述】:

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

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)

【问题讨论】:

  • 当您在else: 块中递归调用check_connection 时,您并没有返回它的值;你只是调用它然后把返回的值扔掉,这意味着函数根本没有return 语句,这意味着它默认返回None
  • 这是一个递归函数,所以我认为这不是问题
  • 目前还不清楚check_connection 应该如何宣布其结果。如果第二个节点在邻居列表中,则返回True,因此这表明它旨在始终返回TrueFalse。但是,如果第二个节点不在邻居列表中,则它根本什么都不返回(因此 None),并且当它在脚本底部调用时,甚至没有捕获返回值,因此这表明您打算以其他方式让函数宣布其结果(可能是您遗漏的print 语句?)

标签: python recursion pass-by-reference


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这似乎有效:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-20
      • 2014-08-28
      • 2018-10-08
      • 1970-01-01
      • 2012-12-01
      • 2021-06-20
      • 1970-01-01
      • 2013-11-13
      相关资源
      最近更新 更多