各ノードのすべての文字を置き換えるトライ文字列データベースを解析する再帰関数があります。再帰呼び出しでは、編集カウントがインクリメントされ、新しい文字列が1)すべてのノードが解析されたかどうか、および2)文字列が承認された文字列のリストの文字列と等しいかどうかがテストされます。したがって、結果は、テスト文字列とデータベース内のすべての可能な文字列の間の編集距離になります。
void suggestCorrections(nodeT *w, Set<CorrectionT> &suggest, int index, string test, string final, double edits)
{
if (word == "") {
if (containsCode(final)) //compare with list of approved strings
updateSet(w, suggest, final, edits);
} else { //continue to search path
if( w->alpha.size() > index) {
if (test[0] == w->alpha[index].char)
suggestCorrections(w->alpha[index].next, suggest, 0, test.substr(1), final+test[0], edits); //follow matching char
suggestCorrections(w, suggest, ++index, test, final, edits);//check next path
suggestCorrections(w->alpha[index].next, suggest, 0, test.substr(1), final+w->alpha[index].char, ++edits);//follow path
}
}
}
struct CorrectionT {
double editDistance; //stackItems
string suggestedWord; //stackItems
string suggestDescription;
string gates;
};
問題は、w-> alpha.size()がindexと等しい場合です。パスは正しく終了しますがsuggestCorrections(w->alpha[index].next, suggest, 0, test.substr(1), final+w->alpha[index].char, ++edits);
、インデックスがw-> alphaの終わりを超えてインクリメントされると、最後のパスが入力されます。なぜ起こるのですか?そして、それはどのように修正されますか?
パスの終わりに達したときに、関数をバックトラックしていると思います。後戻りしたくない。コールスタックとセットアップの中断を確認しましたが、これはバグではなく概念的な問題のようです。再帰に関する教科書の章とウィキペディアのページも読みました。バックトラックの概念は理解していますが、この特定のケースでの実装(または望ましい欠如)は理解していません。私はバックトラッキングを使用してトライデータベースを構築し、そこで機能しましたが、それはこことは十分に異なるため、これを理解することはできません。