[英]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.