简体   繁体   English

如何在没有返回或中断Python的情况下中断函数

[英]How to break out a function without return or break in Python

I'm dfs traversing between nodes a and b, however when I break the loop at node b the algorithm continues. 我是在节点a和b之间遍历的dfs,但是当我在节点b处断开循环时,算法继续。 Here is my code: 这是我的代码:

import networkx as nx

def Graph():
    G=nx.Graph()

    k = 30

    G.add_edge(1,2)
    G.add_edge(2,3)
    G.add_edge(1,3)

    for i in range(2,k+1):
        G.add_edge(2*i-2,2*i)
        G.add_edge(2*i-1,2*i)
        G.add_edge(2*i-1,2*i+1)
        G.add_edge(2*i,2*i+1)

    G.add_nodes_from(G.nodes(), color='never coloured')
    G.add_nodes_from(G.nodes(), label = -1)
    G.add_nodes_from(G.nodes(), visited = 'no')

    return G

def dfs(G,a,b,u):
    global i
    G.node[u]['visited'] = 'yes'
    i += 1
    G.node[u]['label'] = i
    print(u)
    print("i", i)
    for v in G.neighbors(u):
        if v == b:
            G.node[v]['visited'] = 'yes'
            i += 1
            G.node[v]['label'] = i
            print("b is ", v)
            print("distance from a to b is ", G.node[v]['label'])
            break### the problem area, doesn't break out the function
        elif v != b:
            if G.node[v]['visited'] == 'no':
                dfs(G,a,b,v)
G=Graph()
a=1
b=19
i = 0
print('Depth-First-Search visited the following nodes of G in this order:')
dfs(G,a,b,a)  ### count the DFS-path from a to b, starting at a
print('Depth-First Search found in G7 a path between vertices', a, 'and', b, 'of length:', G7.node[b]['label'])
print()

I have tried returning out of the for loop, tried using break and also tried try/catch methods. 我已经尝试退出for循环,尝试使用break并尝试使用try / catch方法。 Is there any elegant way to break out this function or will I have to rewrite it as it doesn't recurse through all neighbors of u? 是否有任何优雅的方式来突破这个功能,还是我必须重写它,因为它没有通过你的所有邻居递归?

The problem here is not break or return , but that you use recursion and you don't stop the loop in each recursive call. 这里的问题不是breakreturn ,而是你使用递归而不是在每次递归调用中停止循环。 What you need to do is to return a result from your dfs function that tells whether you found your node or not, and then break the loop inside your else block if the recursive call did find it. 你需要做的是从你的dfs函数返回一个结果,告诉你是否找到了你的节点,然后如果递归调用确实找到它,则打破你的else块中的循环。 Something like this: 像这样的东西:

def dfs(G,a,b,u):
    global i
    G.node[u]['visited'] = 'yes'
    i += 1
    G.node[u]['label'] = i
    print(u)
    print("i", i)
    for v in G.neighbors(u):
        if v == b:
            G.node[v]['visited'] = 'yes'
            i += 1
            G.node[v]['label'] = i
            print("b is ", v)
            print("distance from a to b is ", G.node[v]['label'])
            return True
        elif v != b:
            if G.node[v]['visited'] == 'no':
                found = dfs(G,a,b,v)
                if found:
                    return True
    return False

Note how this propagates the successful result back up through your entire call stack. 请注意这是如何通过整个调用堆栈将成功结果传播回来的。

In such cases I often use global flag variable to indicate that the searching is finished. 在这种情况下,我经常使用全局标志变量来表示搜索已完成。 For example path_found . 例如path_found

If I understand well, your problem is not that you can't exit the function. 如果我理解得很好,你的问题不在于你不能退出这个功能。

The problem is that you are not breaking out from recursion. 问题是你没有退出递归。 There are many ways of fixing this. 有很多方法可以解决这个问题。

This is one of many examples. 这是许多例子中的一个。 By returning True and checking that in every call, you start bubbling up and skipping at every loop along your recursion. 通过返回True并在每次调用中检查它,您开始冒泡并在递归的每个循环中跳过。 You can understand the True value as 'path found' 您可以将True值理解为“找到的路径”

def dfs(G,a,b,u):
    global i
    G.node[u]['visited'] = 'yes'
    i += 1
    G.node[u]['label'] = i
    print(u)
    print("i", i)
    for v in G.neighbors(u):
        if v == b:
            G.node[v]['visited'] = 'yes'
            i += 1
            G.node[v]['label'] = i
            print("b is ", v)
            print("distance from a to b is ", G.node[v]['label'])
            return True
        elif v != b:
            if G.node[v]['visited'] == 'no':
                if dfs(G,a,b,v):
                    return True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM