如何更正此python dfs搜索?

时间:2018-09-09 23:56:05

标签: python algorithm depth-first-search

我正在编写实现dfs的python代码,但无法正常工作。这是一个使用dfs的愚蠢示例,以查看word是否可以构成lst

def dfs(word, gen):
    print(gen)
    if len(gen) <= len(word):
        if gen == word:
            return True
        lst = ["a","b"]
        for i in lst:
            dfs(word, gen+i)
    return False

print(dfs("ba",""))

这里我的lst是[“ a”,“ b”],显然可以形成“ ba”。但是,它返回False。我得到由print(gen)每次形成的单词的输出:

a
aa
aaa
aab
ab
aba
abb
b
ba
bb
bba
bbb

,我可以在结果中看到ba,所以程序不应该停止递归并在遇到ba时返回True吗?我的代码有什么问题?

3 个答案:

答案 0 :(得分:1)

问题在这里:

for i in lst:
    dfs(word, gen+i)

一旦找到单词,它将返回True,但是调用者将忽略返回的True值,并且无论如何,您最终将生成所有单词并返回False
您只需添加支票,即可在找到匹配项时返回True

for i in lst:
    if dfs(word, gen+i):
        return True

另外,移动一些行,您的函数可以更简洁地编写为:

def dfs(word, gen):
    if len(gen) > len(word):
        return False
    elif gen == word:
        return True
    else:
        return any(dfs(word, gen+i) for i in ("a","b","c"))

答案 1 :(得分:0)

您需要检查dfs函数(if dfs(word, gen+i):)的输出,即:

def dfs(word, gen):
    print(gen)
    if len(gen) <= len(word):
        if gen == word:
            return True
        lst = ["a","b"]
        for i in lst:
            if dfs(word, gen+i):
                return True
    return False

print(dfs("ba",""))

a
aa
aaa
aab
ab
aba
abb
b
ba
True

答案 2 :(得分:0)

该程序不会“停止递归”,除非您从堆栈上的每个函数return开始。 1

您没有这样做。无论对dfs的递归调用返回什么,您都可以忽略它并继续循环:

for i in lst:
    dfs(word, gen+i)

…。然后从循环结束和if语句结束:

return False

因此,这些递归调用除了浪费CPU时间外没有其他作用。除了任何级别的False之外,您只能返回该级别的if gen == word:。因此,如果在顶层情况并非如此,则始终返回False


解决方法很简单:当其中一个递归调用返回True时,您也要返回True:如果该值与gen匹配,或者被找到,则找到该值在gen+'a'上进行深度优先搜索,或者在gen+'b'上进行深度优先搜索时找到。所以:

for i in lst:
    if dfs(word, gen+i):
        return True

现在,如果没有任何响应性调用是正确的,则仅继续循环,直到结束。


1。除非您提出未处理的异常。