Python 递归函数陷入临时循环

Python 递归函数陷入临时循环,python,Python,我有一本以名字为关键字的字典,还有一张他们见过的人的清单作为价值观。 e、 g: 现在,我尝试创建一个函数来检查两个人之间是否存在“链接”(如果指定,这两个人之间的最大距离)。变量“distance”是person_X和person_Y之间的人数。我目前有: def had_contact_with(meetings, person_X, person_Y, distance=-1): if person_Y in meetings[person_X] or person_X == pe

我有一本以名字为关键字的字典,还有一张他们见过的人的清单作为价值观。 e、 g:

现在,我尝试创建一个函数来检查两个人之间是否存在“链接”(如果指定,这两个人之间的最大距离)。变量“distance”是person_X和person_Y之间的人数。我目前有:

def had_contact_with(meetings, person_X, person_Y, distance=-1):
    if person_Y in meetings[person_X] or person_X == person_Y:
        return True
    elif distance == 0:
        return False
    elif distance == -1: #if there is no limit on the distance specified, max distance is len(meetings)
        distance = len(meetings)
    for person in meetings[person_X]:
        if had_contact_with(meetings, person, person_Y, distance-1):
            return True
我的代码可以工作,但有时它会陷入一个循环中一段时间。例如,如果我尝试:

print(had_contact_with(meetings,'a','d'))     
它开始检查a个人的联系人,即b和e。然后它会检查b的联系人,但a是b联系人列表中的第一个,所以它只会在a和b之间进行检查,直到距离变为0。有没有办法阻止它循环


提前感谢

您可以通过维护一组在当前路径上已经访问过的节点来解决此问题。为了方便使用这个集合,我个人更喜欢创建一个嵌套函数来处理递归,并在主函数的作用域中定义该集合,使内部函数可以访问该集合

此外,我认为您的基本情况需要稍作调整,因为当您在结果(1)中有一个正的
时,相等距离比(剩余)距离小一(0)


您可以从子循环中发送的会议中删除当前选中的人员(person_x)。(如果您想保留首字母,请使用copy)

Hi,我可能应该更好地解释“距离”。这是人员X和Y之间的最大人数。如果X和Y之间有2人,则仅当指定的距离大于1时,该函数才能返回True。距离0表示人员X和Y只能直接接触。我将“distance==1”更改为“distance==0”,现在它工作正常。谢谢!很高兴听到这对你有用!
print(had_contact_with(meetings,'a','d'))     
def had_contact_with(meetings, person_X, person_Y, distance=-1):
    visited = set()
    if distance == -1:
        distance = len(meetings)
    if person_X == person_Y:
        return True
    if distance == 0:
        return False

    def recur(person_X, distance):
        if person_Y in meetings[person_X]:
            return True
        if distance == 1 or person_X in visited:
            return False
        visited.add(person_X)
        for person in meetings[person_X]:
            if recur(person, distance - 1):
                return True
        visited.remove(person_X)
        return False

    return recur(person_X, distance)