提案付きのスペルチェッカー用のツリーを構築しています。各ノードには、キー(文字)と値(そのパスに沿った文字の配列)が含まれています。
したがって、私の大きなトライで次のサブトライを想定します。
W
/ \
a e
| |
k k
| |
is word--> e e
|
...
これは、サブトライの単なるサブパスです。Wはノードであり、aとeはその値配列などの2つのノードです。
各ノードで、単語の次の文字がノードの値であるかどうかを確認します。今のところ、タイプミスの母音をサポートしようとしています。したがって、「weke」は提案として「wake」を生成します。searchWord
これが私のトライでの私の機能です:
def searchWord(self, word, path=""):
if len(word) > 0:
key = word[0]
word = word[1:]
if self.values.has_key(key):
path = path + key
nextNode = self.values[key]
return nextNode.searchWord(word, path)
else:
# check here if key is a vowel. If it is, check for other vowel substitutes
else:
if self.isWord:
return path # this is the word found
else:
return None
'weke'が与えられた場合、単語の長さがゼロでパスが' weke'のとき、私のコードは2番目に大きいelseブロックにヒットします。weke
は単語としてマークされていないため、Noneで返されます。searchWord
これはNoneで戻ります。
これを回避するには、スタックの巻き戻しまたは再帰のバックトラックごとに、文字が母音であるかどうかを確認し、母音である場合はもう一度確認する必要があります。
if self.values.has_key(key)
ループを次のように変更しました。
if self.values.has_key(key):
path = path + key
nextNode = self.values[key]
ret = nextNode.searchWord(word, path)
if ret == None:
# check if key == vowel and replace path
# return nextNode.searchWord(...
return ret
私はここで何が間違っているのですか?私がやろうとしていることを達成するためにバックトラックするとき、私は何ができますか?