微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在深度优先搜索时我的 for 循环没有中断

如何解决为什么在深度优先搜索时我的 for 循环没有中断

我正在用 python 进行深度优先搜索要做到这一点,有一个带有一些值的 graph,我必须显示路径,在给定的初始位置,到达最终目的地

visited = set()

def dfs(visited,graph,initial,final):
    if initial not in visited:
        print (initial)
        visited.add(initial)
        for neighbour in graph[initial]:
            if(final == initial):
                print("a")
                break
            dfs(visited,neighbour,final)
    return visited

dfs(visited,'arad','lugoj')

问题在于 for 里面的 if。当我的 final 位置等于当前位置(这意味着我到达我的目的地)时,我想打破它,并返回一个包含到达它的路径的列表。但它不会中断也不会返回任何东西,控制台中显示的唯一值是方法内部的打印。这是控制台:

arad
timisoara
lugoj
a
sibiu
oradea
zerind
rimnicu vilcea
craiova
pitesti
bucharest
fagaras
giurgiu
urziceni
vaslui
lasi
neamt
hirsova
eforie
dobreta
mehadia

如你所见,它必须在 'a' 中打断。

我该如何处理?

##更新

{'timisoara','pitesti','eforie','lasi','craiova','mehadia','urziceni','lugoj','neamt','dobreta','zerind','giurgiu','rimnicu vilcea','bucharest','fagaras','sibiu','vaslui','hirsova','oradea'}

图表

#DEPTH_FirsT_SEARCH
graph = {
    'oradea' : ['zerind','sibiu'],'zerind' : ['arad','oradea'],'arad' : ['timisoara','zerind'],'timisoara' : ['lugoj','arad'],'lugoj' : ['mehadia','timisoara'],'mehadia' : ['dobreta','lugoj'],'dobreta' : ['craiova','mehadia'],'craiova' : ['pitesti','dobreta'],'rimnicu vilcea' : ['craiova',],'sibiu' : ['oradea','fagaras'],'fagaras' : ['sibiu','bucharest'],'pitesti' : ['rimnicu vilcea','bucharest' : ['fagaras','urziceni'],'giurgiu' : ['bucharest'],'urziceni' : ['bucharest','hirsova'],'vaslui' : ['lasi','lasi' : ['neamt','vaslui'],'hirsova' : ['urziceni','eforie'],'eforie' : ['hirsova'],'neamt' : ['lasi']
}

解决方法

问题是你只在递归调用中跳出循环,而不是调用者。

由于您在适当的位置修改了 visited,因此无需返回它。

相反,您可以返回一个布尔值,指示是否找到了 final,并且调用者也可以跳出循环。

此外,finalinitial 在循环期间不会改变,因此无需在那里比较它们。在循环之前做。

def dfs(visited,graph,initial,final):
    if initial not in visited:
        print (initial)
        visited.add(initial)
        if(final == initial):
            print("a")
            return True
        for neighbour in graph[initial]:
            if dfs(visited,neighbour,final):
                return True
    return False

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。