この質問を一般化するために、Zelenski CS クラスの配布資料から資料を借りています。そして、数年前に別のインストラクターからクラスを受講し、C++ へのこのアプローチを学んだので、それは私の特定の質問に関連しています。配布資料はこちらです。C++ は時々使用するため、私の理解度は低いです。基本的に、プログラムを書く必要があったときは、クラスの資料に戻って、似たようなものを見つけてそこから始めました。
この例 (4 ページ) では、Julie は文字列関数で再帰アルゴリズムを使用して単語を探しています。再帰呼び出しの数を減らすために、彼女は決定点を追加しましたbool containsWord()
。
string FindWord(string soFar, string rest, Lexicon &lex)
{
if (rest.empty()) {
return (lex.containsWord(soFar)? soFar : "");
} else {
for (int i = 0; i < rest.length(); i++) {
string remain = rest.substr(0, i) + rest.substr(i+1);
string found = FindWord(soFar + rest[i], remain, lex);
if (!found.empty()) return found;
}
}
return ""; // empty string indicates failure
}
このアルゴリズムの使用方法に柔軟性を追加するために、これを void 型として実装できますか?
void FindWord(string soFar, string rest, Lexicon &lex, Set::StructT &words)
{
if (rest.empty()) {
if (lex.containsWord(soFar)) //this is a bool
updateSet(soFar, words); //add soFar to referenced Set struct tree
} else {
for (int i = 0; i < rest.length(); i++) {
string remain = rest.substr(0, i) + rest.substr(i+1);
return FindWord(soFar + rest[i], remain, lex, words); //<-this is where I am confused conceptually
}
}
return; // indicates failure
}
そして、返品なしでどうですか
void FindWord(string soFar, string rest, Lexicon &lex, Set::StructT &words)
{
if (rest.empty()) {
if (lex.containsWord(soFar))
updateSet(soFar, words); //add soFar to Set memory tree
} else {
for (int i = 0; i < rest.length(); i++) {
string remain = rest.substr(0, i) + rest.substr(i+1);
FindWord(soFar + rest[i], remain, lex, words); //<-this is where I am confused conceptually
}
}
}