满足条件时退出递归函数

时间:2020-09-19 19:53:44

标签: python-3.x recursion exception depth-first-search

我正在尝试使用深度优先搜索(DFS)构建简单的循环检测算法。该算法的工作方式如下:在某个节点上执行DFS(目前仅假设整个图形已连接),并将当前正在使用的任何节点标记为灰色,如果已完成则标记为黑色。如果当前节点的邻居是灰色的,则退出该功能并打印“ Cycle detection”

这是我的代码,带有一个简单的4节点图

from collections import defaultdict
G = {'F': ['X', 'O'], 'X': ['F', 'F'],'O':[]}
V = set(G.keys())
gray, black = set(), []
def dfs(u):
    try:
        print('-'*30,"\n",u)
        gray.add(u)
        for v in G[u]:
            if v in gray:
                raise ValueError
            elif v not in black:
                dfs(v)
        gray.discard(u)
        black.append(u)
    except:
        return True
if dfs('F'):
    print('Cycle detected')

我认为“尝试除外”是可行的,但是没有用。

最后,我知道我可以使用可变变量,例如cycle = [False],如果满足我的条件,可以将其更新为true。我在问如何避免这样做!谢谢!

1 个答案:

答案 0 :(得分:0)

算法没有中断。可以修复如下:

除去图案以外的尝试,而将循环替换为adj顶点

for v in G[u]:
    if v in gray:
        return True
    elif v not in black:
        if dfs(v):
            return True
if中的

dfs(v)承担双重职责,打开递归调用并检索其输出。由于此返回位于最外层递归中,并且位于上述return语句之后,因此当最内层递归返回True时,它将自动切断进一步的搜索并返回true。