2017-09-13 62 views
-1

对于我的递归考试,我必须编写一个递归函数来遍历链表,并删除所有不包含某些数据的节点,并计算在C++中删除的节点数。我不允许使用静态函数,静态局部变量或全局变量。我该怎么做呢?递归计算递归函数中发生的循环数,而不使用静态局部变量,全局变量或静态函数?

具体使用的函数是:INT remove_except(节点* &头,节点* &尾),并且它的直线链表上使用。我无法找到任何方法来计算删除的节点数量,而不使用上面列出的三种方法之一。

+0

免费的线索:请问这是由一个呼叫者称为函数会返回* *的值到主叫方,像是某种计数器,或什么的? –

+0

这里没有代码,只是一个方法签名。我们应该从中看出什么?我也很困惑你为什么传递指针的引用。 – tadman

+0

@SamVarshavchik我想你应该说我应该返回一些名为counter的整数,并在每次循环发生时递增?但我不知道如何在不改变函数原型的情况下在递归函数中执行此操作,或者创建一个静态变量或全局变量,这两者我都不允许这样做。 –

回答

1

由于您不能使用变量或参数,因此只会留下一个选项 - 使用函数的返回值

对于递归函数的每次调用,执行下列操作:

  • 如果输入节点位于列表的末尾,则返回0。

  • 否则,如果所述输入节点是移除,返回1 +下一个调用的返回值(使用下一个节点作为输入)。

  • 否则,按原样返回下一个调用的返回值(使用下一个节点作为输入)。

当所有的调用都完成后,1会加起来,因为控制器会将调用堆栈备份到原始调用方。

例如:

int remove_except(node * & head, node * & tail) 
{ 
    if (!head) return 0; 
    node *next = head->next; 
    if (... /* head is to be removed */) 
    { 
     removeNode(head, tail); 
     return 1 + remove_except(next, tail); 
    } 
    return remove_except(next, tail); 
}