我有一个Graph类,为树建模。图包含指向我当前实例(我当前节点)的父项的指针Graph*
。
class Graph
{
private:
Graph* parent;
public:
Graph* getparent();
}
Graph* Graph::getparent()
{
return this->parent;
}
如果是root,则父级位于nullptr
。
我试图从节点开始寻找从节点到根的距离。
这是我的尝试:
int Graph::howManyParents(Graph* unparent)
{
int nbParents(0);
if(unparent != nullptr)
{
nbParents++;
nbParents =+ howManyParents(this->parent);
}
return nbParents;
}
它编译但崩溃。调试器向我展示了对该方法的大量调用,但最终得到了SegFaulting。我的算法有问题吗?
答案 0 :(得分:3)
你的递归永远不会停止,除非你把它传递给根,因为你总是调用this->howManyParents
,因此传递给它的同一个父,它不会变为空。
目前还不清楚您是想要距参数的距离还是距离this
的距离。
查找给定节点的距离(没有理由成为其成员):
int howManyParents(Graph* unparent)
{
int nbParents(0);
if(unparent != nullptr)
{
nbParents = howManyParents(unparent->getparent()) + 1;
}
return nbParents;
}
查找this
的距离:
int Graph::howManyParents()
{
int nbParents(0);
if(parent != nullptr)
{
nbParents = parent->howManyParents() + 1;
}
return nbParents;
}
答案 1 :(得分:2)
我认为你导致堆栈溢出太深或无限递归。
检查输入是否存在错误以确保它确实是树,因为如果图中出现循环,递归将是无限的。
另外,尝试增加程序的堆栈大小。
在Linux上运行命令:
ulimit -s unlimited
要在Microsoft Visual C ++中执行此操作,只需将此行添加到代码中:
#pragma comment(linker, '/STACK:67108864');
要在MinGW G ++中执行此操作,请将此选项添加到编译行:
-Wl,--stack,67108864
但是,我认为非递归解决方案总体上更好。
int Graph::howManyParents(Graph* unparent)
{
int nbParents(0);
while (unparent != nullptr)
{
nbParents++;
unparent = unparent->parent;
}
return nbParents;
}
最好使用循环而不是递归,这样可以提高性能和代码可读性。
仅在真正需要的地方使用递归。例如,遍历树。
答案 2 :(得分:1)
你可以这样做:
int Graph::howManyParents()
{
return getparent() ? getparent()->howManyParents() + 1 : 0;
}
另外,不要忘记编写构造函数来创建parent = nullptr
,它不是默认构造函数。