我有一个简短的递归函数来编写,当我通过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
}
答案 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;
}