我的知识有限,用C ++写了2个月
在此函数中,string code
递归递减字符,直到找到基本情况""
。我想在找到基本案例之前修剪一些路径,对于某些string code
,将找不到基本案例的路径。对于剪枝,我想将路径中的属性与参数int time
进行比较。这会搜索由'nodeT'组成的trie
struct charT {
char letter;
nodeT *next;
};
struct nodeT {
bool isOperation;
bool isCode;
int time;
Vector<charT> alpha;
};
nodeT *root
usage:
string code = "12345";
int time = convertToEpoch(20120815); //my epoch function
containsCode(code, time)
bool containsCode(string code, int time)
{
if(root == NULL) return false;
else return containsCodeHelper(root, code, time);
}
bool containsCodeHelper(nodeT *w, string code, int time)
{
if(code == "") //base case: all char found
return w->isCode;
else {
if (w->isOperation && w->time != time) return false; //case 2: time check OK <- at a midpoint in the path
for(int i = 0; i < w->alpha.size(); i++) { //Loop through the leaf
if (w->alpha[i].letter == code[0]) //case 3: leaf exists
return containsCodeHelper(w->alpha[i].next, code.substr(1), time);
}
}
return false; //if no path
}
在添加时间检查修剪之前,此功能运行良好,如果在时间之外它现在循环returns false
,但随后从char位置0再次使用候选string code
。
问题:1)嵌套return false
是否将递归推回到下一个循环调用,2)是否应将时间修剪置于具有逻辑return false
或{{1的for循环中“路径”,3)这是一个更根本的混乱,我需要学习一个C ++概念&lt; - 请解释是否。
此外,发布的功能是实际功能的简化版本 - 有一个时间修改器和我遗漏的“跳过”路径。在过去的问题中,我发现这些“插件”会分散注意力。
答案 0 :(得分:0)
return w->isCode
到return true
,这似乎是最大的问题 - 我将调试trie构造函数并查看它是否在每个路径的末尾设置属性。
boolcontainsCodeHelper(nodeT *w, string code, int time)
{
if(code == "") //base case: all char found
return true;
else {
if ( w->isOperation && (!((w->begin-wag) <= time && time <= (w->end+wag) ) && time != 9999 ) )
return false; //case 2: time
else {
for(int i = 0; i < w->alpha.size(); i++) { //Loop through all of the children of the current node
if (w->alpha[i].letter == word[0])
return containsCodeHelper(w->alpha[i].next, word.substr(1), time, wag);
else if (word[0] == 'ž') //step over '0' all subnodes
if (containsCodeHelper(w->alpha[i].next, word.substr(1), time, wag))
return true;
}
}
}
return false; //if char is missing - meaning the exact code is not there - terminates garbage subnode paths
}
我认为在最后使用return false;
并将其删除之间没有任何区别。还特别困惑的是为什么特殊情况需要if( bool fn()) return true;
而不仅仅是return ( bool fn());
我在另一个stack overflow thread的帮助下通过反复试验找到了解决方案