Программа не "останавливает рекурсию", если вы не return
от каждой функции в стеке. 1
И ты этого не делаешь. Независимо от того, что возвращает рекурсивный вызов dfs
, вы просто игнорируете его и продолжаете свой цикл:
for i in lst:
dfs(word, gen+i)
… а затем выпадают из конца цикла и оператора if
и:
return False
Итак, эти рекурсивные вызовы не имеют никакого эффекта, кроме как тратить процессорное время. Единственный способ вернуть что-либо кроме False
на любом уровне - это if gen == word:
на этом уровне. Поэтому, когда это не так на верхнем уровне, вы всегда возвращаете False
.
Исправление простое: когда один из рекурсивных вызовов возвращает True
, вы также хотите вернуть True
: значение найдено, если оно соответствует gen
, или если оно найдено в поиске в глубину на gen+'a'
, или если он найден при поиске в глубину на gen+'b'
. Итак:
for i in lst:
if dfs(word, gen+i):
return True
Теперь вы продолжаете цикл и прекращаете работу только в том случае, если ни один из повторных вызовов не соответствует действительности.
1. Если вы не создадите необработанное исключение.