我正在编写实现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吗?我的代码有什么问题?
答案 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。除非您提出未处理的异常。