Чтобы обобщить этот вопрос, я заимствую материал из раздаточного материала Zelenski CS. И это имеет отношение к моему конкретному вопросу, поскольку несколько лет назад я прошел курс у другого инструктора и изучил этот подход к С++. Раздаточный материал находится здесь. Мое понимание C++ низкое, так как я использую его время от времени. По сути, несколько раз, когда мне нужно было написать программу, я возвращался к материалам класса, находил что-то похожее и начинал оттуда.
В этом примере (стр. 4) Джулия ищет слово, используя рекурсивный алгоритм в строковой функции. Чтобы уменьшить количество рекурсивных вызовов, она добавила точку принятия решения 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
}
}
}