调试递归算法

时间:2012-11-26 11:22:27

标签: java debugging recursion

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

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

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

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

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

5 个答案:

答案 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做条件断点。