pset4拼写器使用trie。尺寸功能出现问题

时间:2019-07-15 18:36:14

标签: c cs50 trie

我正在使用Trie开发pset4拼写器。我想使用递归来查找加载的字典的大小。但是没有任何效果。根据调试器的操作,我认为它可能无法恢复到sizer先前指向的位置。例如,在:

的字典中
const regex = /\"\$date\"\s*:\s*"(\d{4}-\d{2}-\d{2}[A-Z]\d+:\d+:\d+\.\d+[A-Z])"/gm;
const str = `"\$date" : "2019-07-10T17:34:01.222Z"`;
const subst = `$1`;

const result = str.replace(regex, subst);

console.log(result);

大小能够读取前三个。但是当我将计数器恢复为以前的大小时,它在a之后不读字母b。我认为它仍在检查读取aab的数组。我该怎么办???

a
aa
aab
ab

1 个答案:

答案 0 :(得分:1)

  

我认为它仍在检查读取aab的数组。我该怎么办???

我认为你是对的。

请考虑如何在此代码中更新全局变量sizer的值。您这样做的唯一方法是:

sizer = sizer -> children[i];

由于您只将sizer设置为指向当前节点的子节点之一,而从未将其还原为先前的值,因此该程序从根到叶正好遵循一条路径,然后将其耗尽它的能力。使用不同的输入,您可以亲自证明这是正在发生的事情。例如,

a
b
ba

将报告计数为1,因为它首先穿过节点“ a”,并且是叶子。

全局变量很容易使您陷入麻烦,尤其是可修改的变量。现在就开始养成避免使用它们的习惯。宁愿通过参数将信息传递给函数。

在大多数情况下,也希望避免递归,甚至在您有更多经验之前(甚至会告诉您“我不想要任何东西”),甚至不要考虑将递归与可修改的全局变量结合使用。 / p>

目前尚不清楚sizer的类型是什么,但假设它是struct sizer *。在这种情况下,请考虑将功能签名更改为

所需的其他更改
unsigned int size(const struct sizer *node_sizer);

这不只是一种风格。正确完成后,它也可以解决您的功能问题。