可以在没有`trav`指针的情况下使用此递归函数吗

时间:2019-07-18 12:34:26

标签: c recursion cs50 trie

我正在尝试使用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;

1 个答案:

答案 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变量中。