簡體   English   中英

遞歸函數C ++的問題

[英]Issue with recursive function C++

我有一個簡短的遞歸函數要編寫,當我通過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
}

您的評論在撒謊。

// smaller case
Node *Bane = h;

在這里,您將Bane設置為傳遞給函數的值。 實際上並沒有測試列表中的下一個項目,而是再次執行了相同的列表。

這不是代碼中的唯一問題,但是至少可以幫助您解決所提出的問題。

遞歸的第一個問題應該總是:我是否需要遞歸? 迭代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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM