情報を最後のノードに渡して、行き止まりになったときにたどったパスを出力するか、たどったパスを呼び出し元に戻して、最後にパス全体を出力できるようにします。
子関数を再帰的に呼び出してデータを転送することは明らかなはずです...あえて言えば、簡単です;)
これを逆に行うには、再帰関数が子呼び出しからトラバースされたノードのリスト (トラバースされたサブパスのリスト) を戻り値として受け入れるようにします。関数の最後に、サブコールの場合は、関数自体がアクセスしたノード パスと共にそれらを返します (他のノードの先頭に追加し、それ以上の深さ再帰がない場合は、単一のノードをリストに追加します)。いくつかのノードで行われました)。
最後に、サブコールでない場合は、通過したすべてのパスの完全なリストが表示されます。それらを印刷するだけです。
たとえば、[AAA、ABA、ACA、ABC、ACC] という文字を調べたいとします。いくつかのパスは無効です (たとえば、A の後に C をトラバースすることは許可されていません)。
def mypathsearch(path_traversed, current_letter, left_letters): """検索された文字列、current_letter 文字、および各位置の残りの文字の組み合わせを含む文字配列の配列を取ります"""
if can_traverse(path_traversed, current_letter):
for next_letter in remaining_letters[0]:
letters_after = remaining_letters[1:]
sub_paths_searched = mypathsearch(
path_traversed + current_letter, next_letter, letters_after
)
else:
# end of the line
print_path_traversed(path_traversed)