我已经从链表中建立了一个特里。每个节点包含一个char和一个包含27个节点的数组(字母表中的字母+ $表示单词结尾的额外位置)。 我尝试编写一个递归方法来计算单词的数量,但它返回1.我不确定如何解决它或确切的错误。
int recursiveCount(Node* temp, int count)
{
if (temp->value == '$')
{
count++;
}
for (int i = 0; i < 27; i++)
{
if (temp->array[i] != NULL)
{
return recursiveCount(temp->arr[i],count);
}
}
return count;
}
答案 0 :(得分:0)
您通过值传递count
,这意味着当递归解除时,它会超出范围,并且只有最远的一个&#34; out返回,因为我是第一个count
增加它只是1.通过引用而不是int recursiveCount(Node* temp, int& temp);
答案 1 :(得分:0)
正如其他答案中已经提到的,您的问题是您拥有不同的count
变量,每个递归调用一个变量。增加一个不会改变其他人。除了传递(非常量)引用之外,您还可以使用更多函数式编程方法并从函数中返回计数。当然,您需要总结您所做的所有递归调用的返回计数:
unsigned recursiveCount(Node const * node) /* you don't change the node, so make
it const. Why a pointer btw? A
reference would do fine! */
{
unsigned count = 0; /* You aren't expecting a negative number of
words, are you? So use unsigned. */
if (node->value == '$')
{
count++;
}
for (int i = 0; i < 27; i++)
{
if (node->array[i] != NULL) /* "array"!? change that to a meaningful
name ... "children" is bad, but not as
bad as "array" ... */
{
count += recursiveCount(node->array[i]); /* "arr" was a typo I
suppose */
}
}
return count; /* consistent indentation, please! */
}
答案 2 :(得分:0)
您已将此标记为C ++,因此我很困惑为什么该方法不是Node的一部分。见封装。
递归代码中的重大错误不是添加在每个后续节点中找到的每个'$'。特别是,您的代码只返回for循环的一次调用计数,所有其他循环都被丢弃。
for (int i = 0; i < 27; i++)
{
if (temp->array[i] != NULL)
{
return recursiveCount(temp->arr[i],count);
// This only returns one value,
// and ignores all the other 26 possible values
// these should sum together
}
}
考虑将方法作为节点的一部分。请注意retVal如何累积每个'$'。
int Node::recursiveCount()
{
int retVal = 0; // accumulation
if (value == '$')
{
retVal += 1; // 1 word found here
}
// keep searching here, there might still be words with prefix
for (size_t i = 0; i < 27; i++)
{
if (nullptr != nxt[i])
{
retVal += (nxt[i]->recursiveCount());
// ^^ accumulate any other words found
}
}
return (retVal); // return full count
}