簡體   English   中英

遞歸 function 卡在臨時循環中

[英]Recursive function gets stuck in a temporary loop

我有一本以姓名為鍵的字典,以及他們所遇到的人的列表作為值。 例如:

meetings = {'a': ['b', 'e'], 'b': ['a', 'c', 'e'], 'c': ['b', 'd'], 'd': ['c'], 'e': ['a', 'b']}

現在我正在嘗試制作一個 function 來檢查兩個人之間是否存在“鏈接”(如果指定了這兩個人之間的最大距離)。 變量“距離”是 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。有沒有辦法阻止它進入循環?

提前致謝

您可以通過維護一組您已經在當前路徑上訪問過的節點來解決這個問題。 為了方便使用這個集合,我個人更喜歡創建一個嵌套的 function 來處理遞歸,並在主函數的 scope 中定義該集合,內部 ZC1C425268E68385D1AB507 可以訪問。

另外,我認為您的基本情況需要進行一些調整,因為當您in結果(1)為正時,相等距離比(剩余)距離小一(0)。

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)

您可以從子循環中發送的會議中刪除當前檢查的人員 (person_x)。 (如果您想保留最初的副本,請附上副本)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM