【问题标题】:Counting repeated elements in a singly linked list using recursion使用递归计算单链表中的重复元素
【发布时间】:2020-10-15 07:15:13
【问题描述】:

我有两个函数,一个是帮助函数,它使递归计算重复项的数量。

对于带有 {97,92,97,80,97} 的单链表,结果应该是 3(因为 97 重复了 3 次),但是它返回 1。为什么会这样?

template <typename Data_t>
Data_t SLinkedList<Data_t>::Freq() {
    
    Node* ptr = _head;
    Data_t element;
    ptr->_data = element;
    return FreqHelper(element);
    
}
template <typename Data_t>
Data_t SLinkedList<Data_t>::FreqHelper(Data_t element) {
    
    unsigned int count = 0;
    if(empty()) {
        return 0;
    }
    else if(_head->_data == element) {
        _head = _head->_next;
        FreqHelper(_head->_next->_data);
        count++;
        
    }
    return count;
}

【问题讨论】:

  • 为什么你的Freq函数会覆盖头节点的data
  • 此外,您通常希望使用递归函数的计算值,而您的 FreqHelper 不会这样做(它完全忽略调用的结果)
  • 尝试用count += FreqHelper(_head-&gt;_next-&gt;_data);替换FreqHelper(_head-&gt;_next-&gt;_data); count++;

标签: c++ recursion singly-linked-list


【解决方案1】:

要使用递归,你的递归函数要么返回一个数字,要么不返回,在这种情况下,你可以保留一个全局变量计数。您正在混合两种方法。此外,您还需要一个停止递归的基本案例。

要么

template <typename Data_t>
Data_t SLinkedList<Data_t>::FreqHelper(Data_t element,Node *t) {

     if(t==nullptr)return 0;

     int count=t->_data==element?1:0;
    
     return count+FreqHelper(element,t->next);
 }
  

或者

template <typename Data_t>
    void SLinkedList<Data_t>::FreqHelper(Data_t element,Node *t) {
    
         if(t==nullptr)return;
         if(t->_data==element)++count; //count is assumed a global variable
         FreqHelper(element,t->_next);
     }

【讨论】:

  • 请不要推荐使用全局变量,这是一个非常糟糕的主意。如果有任何返回值的替代方法是使用“输出参数”(函数修改的引用参数)
  • element=?1:0 是什么意思?
  • 我同意你的看法。我不建议我只是尽量让代码尽可能接近他的初始版本
  • @sadboy99 这就像 if else 语句。如果 t->_data==element 则为 Count 分配 1,否则为 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2023-03-11
相关资源
最近更新 更多