递归函数C ++的问题

时间:2014-05-21 00:44:36

标签: c++ recursion linked-list

我有一个简短的递归函数来编写,当我通过g ++运行时,我的函数返回seg fault 11时遇到了问题。我在递归时非常糟糕,只是开始学习它。如果您有任何建议,请告诉我!目标是计算有多少节点的值大于输入值“m”。这是我的代码:

int LinkedList::countOccurrencesMoreThanRec(int m)
{
    // first do the base cases that do not require recursion
    if (head == NULL)
        return -1;
    int answer = 0;
    if ((head -> getNext()) == NULL)
    {
        if ((head -> getValue()) > m)
            answer ++;
        return answer;
    }
    // if none of those were true, call the recursive helper method
    Node *BatMan = head;
    answer = countOccurrencesMoreThan(BatMan, m);
    return answer;
}

/* countOccurrencesMoreThan
 *
 * private recursive method.  
 * TODO: fill in this method
 */

int LinkedList::countOccurrencesMoreThan(Node *h, int m)
{
    // check for the base case(s)
    int answer = 0;
    if ((h -> getNext()) == NULL)
    {
        if ((h -> getValue()) > m)
            answer++;
        return answer;
    }
    // smaller case
    Node *Bane = h;
    answer = countOccurrencesMoreThan(Bane, m);
    return answer;
    // general case
}

2 个答案:

答案 0 :(得分:1)

你的评论在说谎。

// smaller case
Node *Bane = h;

在这里,您将Bane设置为传递给您的函数的相同值。您实际

这不是代码中唯一的问题,但它至少会帮助您提出问题。

答案 1 :(得分:0)

递归的第一个问题应该始终是,我需要递归吗?迭代LinkedList的元素时,绝对不需要递归。

其次,我强烈建议不要滚动你自己的链表类,因为编写自己的链表类的时间最好花在学习STL这样的库上,它可以免费提供开箱即用的优秀数据结构(其他同事理解!)。

然而,为了实现你试图以递归方式实现的目标,你可以将“answer”设置为类成员,全局变量( shudder )或将答案传递给函数的每次调用(在第一个实例中传递零),但我不能强调,递归方法是解决此问题的正确方法。对于一个开始,回答变量在LinkedList类中没有位置,全局变量几乎总是邪恶的,并且传递一个你只是递增的值是低效且令人困惑的。

int LinkedList::countOccurrencesMoreThan(Node *h, int m, int answer)
{

    if( h->getValue() > m ) {
        ++answer;
    }
    if (h -> getNext() == NULL)
    {
       return answer;
    }
    countOccurrencesMoreThan( h->getNext(), m, answer);

}

这是一个更好的非递归实现,带有一个简单的LinkedList类:

void LinkedList::countOccurrencesMoreThan(int value) {

    Node* node = this->head;
    int occurrences = 0;
    while(node != NULL) {
        if( node->getValue() > v ) {
            ++occurrences;
        }
        node = node->getNext();
    }
    std::cout << "occurrences = " << occurrences << std::endl;
}