Pour généraliser cette question, j'emprunte le matériel d'un polycopié du cours de CS de Zelenski. Et, il est pertinent pour ma question spécifique puisque j'ai suivi le cours d'un autre instructeur il y a plusieurs années et j'ai appris cette approche du C++. Le document est le suivant aquí . Ma compréhension du C++ est faible puisque je l'utilise occasionnellement. En fait, les quelques fois où j'ai eu besoin d'écrire un programme, je suis retourné au matériel de cours, j'ai trouvé quelque chose de similaire et j'ai commencé à partir de là.
Dans cet exemple (page 4), Julie cherche un mot en utilisant un algorithme récursif dans une fonction de chaîne. Pour réduire le nombre d'appels récursifs, elle a ajouté un point de décision 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
}
Pour ajouter de la flexibilité à l'utilisation de cet algorithme, peut-on l'implémenter en tant que type 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
}
Et, pourquoi pas sans les retours
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
}
}
}