调试递归算法

我的问题是,是否有一些智能的方法来调试复杂的递归算法。 假设我们有一个复杂的(不是一个简单的情况,当递归计数器在每个’嵌套迭代’中减少’)。

我的意思是在循环可能时递归遍历图形。

我需要检查一下我是否没有得到无限循环。 只使用调试器来做这件事并没有给出确定的答案(因为我不确定算法是在无限循环中还是只是处理它)。

没有具体的例子,很难解释它。 但我需要的是……

‘检查无限循环是否发生在让我们说复杂的递归算法’。

您需要为您认为算法终止的原因形成一个理论。 理想情况下,将理论certificate为数学定理。

您可以查找在每次递归调用时确实减少的问题状态的函数。 例如,请参阅以下有关Ackermann函数的讨论,来自维基百科

A(m,n)的评估总是终止可能不是很明显。 然而,递归是有界的,因为在每个递归应用中,m减小,或m保持相同并且n减小。 每当n达到零时,m减小,因此m最终也达到零。 (从技术上讲,在每种情况下,对(m,n)在对上的字典顺序中减少,这是一个良好的排序,就像单个非负整数的排序一样;这意味着一个不能在排序中下降无数次连续。)然而,当m减少时,n可以增加多少没有上限 – 并且它通常会大大增加。

这是你应该考虑应用于算法的推理类型。

如果您无法找到certificate算法终止的任何方法,请考虑查找可以certificate其终止的变体。 并不总是可以确定任意程序是否终止。 诀窍是编写可以certificate终止的算法。

Best通过前后条件,变体和不变量certificate了有限性。 如果您可以指定一个(虚拟)公式,每次调用时哪个值会增加,您就有了保证。

这与certificate循环是有限的相同。 此外,它可能使复杂的算法更具粘性。

如果你想检查无限循环,

写一个System.out.println("no its not endless"); 在下一行调用递归函数。

如果循环是无限的,这个语句不会打印,否则你会看到输出

您需要计算递归调用的深度…然后在递归调用的深度达到某个阈值时抛出exception。

例如:

 void TheMethod(object[] otherParameters, int recursiveCallDepth) { if (recursiveCallDepth > 100) { throw new Exception("...."); } TheMethod(otherParameters, ++recursiveCallDepth); } 

一个建议如下:

如果你有无限循环,那么在图形的情况下,你将获得一个顶点数大于图中顶点总数的路径。 假设图中顶点的数量是一个全局变量(我认为这是最常见的情况),如果深度已经高于顶点总数,则可以在递归开始时执行条件断点。

这是一个如何在Eclipse中为java执行条件断点的链接 。