python - 如何更正此 python dfs 搜索?

标签 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?我的代码有什么问题?

最佳答案

问题出在这里:

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"))

关于python - 如何更正此 python dfs 搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52249551/

相关文章:

java - 卡在 N-Queens java 算法中。 (回溯)

algorithm - 二叉搜索树可以实现一个Map吗?

algorithm - DFS算法遍历

algorithm - 从图中消除顶点

python - 如何将 pyshark 数据包发送到特定网络接口(interface)?

python - 自动礼物的循环问题

python - 如果 WTForms 被定义为验证字段,它如何知道使用 validate_<field name>?

python - 在我用 Python 定义的函数中通过 opencv 旋转图像

压缩小文件的算法(345 字节)

Java赋值使用Dijkstra的搜索方法,广度优先和深度优先