C++ 为什么我的方法会进入无限递归?
我已经编写了一个方法来帮助构建四叉树。每个四叉树有一个根节点,根节点有4个子节点。我使用深度递归来阻止这个函数划分太多次。通过的深度等于正方形侧面的圆木底2(始终通过正方形)。然而,我从中得到无限递归。有人知道为什么吗C++ 为什么我的方法会进入无限递归?,c++,C++,我已经编写了一个方法来帮助构建四叉树。每个四叉树有一个根节点,根节点有4个子节点。我使用深度递归来阻止这个函数划分太多次。通过的深度等于正方形侧面的圆木底2(始终通过正方形)。然而,我从中得到无限递归。有人知道为什么吗 当我运行它时,输出是“Depth=0”无数次。看不到深度检查有任何问题。你确定第一次通话的深度正确吗?也许它不是无限的,只是太深了?我可能错了,但在第一次调用时显示深度。 如果其值为NaN。您得到了答案。您对buildTreeHelper递归调用的处理似乎完全正确。在递归之前检查
当我运行它时,输出是“Depth=0”无数次。看不到深度检查有任何问题。你确定第一次通话的深度正确吗?也许它不是无限的,只是太深了?我可能错了,但在第一次调用时显示深度。
如果其值为NaN。您得到了答案。您对
buildTreeHelper
递归调用的处理似乎完全正确。在递归之前检查depth
终止条件,并且总是使用depth-1
调用它
我能看到的唯一潜在问题是构造函数调用(创建子类的调用)是否再次调用
buildTreeHelper
。例如,如果构造函数总是使用depth
的对象变量调用buildTreeHelper
(每次的值都相同或更大)。如果n->isLeaf()
条件意味着“所有n
的子项都为null”,那么我想这里总是错的。你能用“QuadtreeNode*n”替换buildTreeHelper(…)中的第二个参数“QuadtreeNode*n”并检查结果吗???对buildTreeHelper
的原始调用在哪里?我可以想象它在构造函数中。您是否尝试过使用调试器单步执行它?您确定它是无限递归的,而不仅仅是耗尽堆栈吗?深度的值到底是多少?即使是一个相对较小的值也会导致递归调用的指数数量(4^depth
)。在四叉树中的buildTreeHelper方法中,是否可以用“QuadtreeNode*&n”替换“QuadtreeNode*n”对于第二个参数并检查结果??如果没有代码,我们如何理解这个问题?无限递归->所有地狱破裂lool好吧,如果深度==0,我放一条cout行,这样它就输出了深度。它只是无限地输出depth=0。无限地,或仅4^n次(其中n是原始深度)?您是否尝试过使用较小的深度值,例如depth=1
或depth=2
?现在我尝试了。我有一个seg故障错误。我的复制构造函数有问题。让我把它贴出来。看起来有点怪吗?在int
中?这将是令人印象深刻的:-)根据您的编辑,我认为这不是解决方案。但是如果深度值是Nan(不是一个数字),那么(如果同时Nan对于int是不被禁止的。它只是从来没有被实现过:事实上我刚刚意识到我的节点复制构造函数有点古怪。让我发布它,看看它是否是okYes,这就是它的意思。为什么呢?因为你给孩子们分配了上面几行。:)但最终它会停止,当它停止时,最后一个节点将最终成为叶节点这里将是叶节点,但您不会初始化它们的n->元素
,因为为它们调用的buildTreeHelper
将立即返回深度,即使深度=1或2??你的意思是对的??