我的问题是,是否有一些智能方法来调试复杂的递归算法。 假设我们有一个复杂的(不是一个简单的情况,当递归计数器在每个嵌套迭代中减少时#39;)。
我的意思是在循环可能时递归遍历图形。
我需要检查一下我是否没有得到无限循环。使用调试器执行此操作并不能给出确定的答案(因为我不确定算法是在无限循环中还是只是处理它)。
如果没有具体的例子,很难解释它。但我需要的是......
'检查无限循环是否发生在让我们说复杂的递归算法中。
答案 0 :(得分:3)
最好通过前后条件,变体和不变量证明有限性。如果您可以指定一个(虚拟)公式,每次调用时哪个值会增加,您就有了保证。
这与证明循环是有限的相同。此外,它可能使复杂的算法更具吸引力。
答案 1 :(得分:3)
您需要形成一个理论,说明您认为算法终止的原因。理想情况下,将理论证明为数学定理。
您可以查找在每次递归调用时确实减少的问题状态的函数。例如,请参阅以下关于Ackermann函数的讨论,来自Wikipedia
A(m,n)的评估总是终止可能不是很明显。但是,递归是有界的,因为在每个递归应用中,m减小,或m保持不变,n减小。每当n达到零时,m减小,因此m最终也达到零。 (从技术上讲,在每种情况下,对(m,n)在对上的字典顺序中减少,这是一个良好的排序,就像单个非负整数的排序;这意味着一个不能在排序中下降无数次连续。)但是,当m减少时,n的增加量没有上限 - 而且往往会大大增加。
这是您应该考虑应用于算法的推理类型。
如果您无法找到证明算法终止的任何方法,请考虑查找可以证明其终止的变体。并不总是可以决定任意程序是否终止。诀窍是编写可以证明终止的算法。
答案 2 :(得分:1)
如果你想检查无限循环,
在调用递归函数的下一行写一个System.out.println("no its not endless");
。
如果循环是无穷无尽的,则此语句不会打印,否则您将看到输出
答案 3 :(得分:1)
您需要计算递归调用的深度...然后在递归调用的深度达到某个阈值时抛出异常。
例如:
void TheMethod(object[] otherParameters, int recursiveCallDepth)
{
if (recursiveCallDepth > 100) {
throw new Exception("...."); }
TheMethod(otherParameters, ++recursiveCallDepth);
}
答案 4 :(得分:0)
一个建议如下:
如果你有无限循环,那么在图形的情况下,你将获得一个顶点数大于图中顶点总数的路径。假设图中顶点的数量是一个全局变量(我认为这是最常见的情况),如果深度已经高于顶点总数,则可以在递归开始时执行条件断点。 / p>
Here is a link如何在Eclipse中为java做条件断点。