我正在尝试使用pset4拼写器。该函数给出作为字典加载的字典的大小。如果不使用我正在使用的trav
指针,此功能可以工作吗?我必须指向先前的位置还是不必要?
在函数调用中是否会记住我的位置,并且每次我递归调用函数时,指向sizer的指针只会是该调用所特有的?并且一旦将控件返回到上一个函数,它将在我调用递归函数之前在先前的位置运行吗?还是我必须将其专门指向先前的位置?
unsigned int size(void)
{
node *trav = root;
int ctr = 0;
for (int i = 0; i < N; i++)
{
//Sizer is also a node pointer initialized to root globally
if (sizer -> children[i] == NULL)
{
continue;
}
else
{
//Store the current value of sizer
trav = sizer;
//Change sizer to point to its child
sizer = sizer -> children[i];
if ((sizer -> is_word) == true)
{
ctr ++;
}
// recursively call size again
int x = size();
ctr += x;
/*After adding the number all the words IN THE CHILDREN
of this particular child, I want to point to the
original `sizer`, so that i can move on to the next
child and repeat the same for its chidren. To do that
i need something to point back to original position
*/
sizer = trav;
}
}
return ctr;
答案 0 :(得分:2)
该功能可以在不使用我正在使用的trav指针的情况下工作吗。
嗯...不,不是这个功能。这里的问题是sizer
是全局的,因此当您希望代码对其进行更改并随后将其还原时,您将需要一个额外的变量来存储值,然后再对其进行更改。
但是,为什么要使用全局变量?
如果将指针传递到“当前根”,则可以避免使用trav
,并且可以得到更干净的设计,而无需使用全局变量。
类似的东西:
unsigned int size(node *sizer)
{
unsigned int ctr = 0; // notice: changed to unsigned to match the return type
for (int i = 0; i < N; i++)
{
if (sizer -> children[i] != NULL)
{
if ((sizer->children[i]->is_word) == true)
{
ctr ++;
}
// recursively call size again while passing sizer->children[i]
ctr += size(sizer->children[i]);
}
}
return ctr;
}
现在,每个递归调用都有其自己的sizer
变量,因此您无需更改sizer
,因此不需要将其存储到trav
变量中。