![](/img/trans.png)
[英]What is the time complexity of recursion approach (Java) for “Maximum Depth of Binary Tree”?
[英]Set maximum recursion depth in java
我知道这个问题已经通过多种方法得到了解答:
-Xss20m
) 这些方法很棒,但是我知道我的代码中有问题,我想专门限制(例如5个小数目)递归深度,以测试这是否是问题所在。
有没有一种方法,例如python中的sys.setrecursionlimit
?
这样做的侵入性最小的“手动”方法(也是最容易破解的)可能是在您的类中创建一个存在递归问题的静态变量。 当您输入递归方法时,使用它来计算递归深度(通过加法或减法),当您退出时,请反转输入时所做的操作。
这不是很好,但是比尝试设置堆栈深度要好得多(几乎Java中的任何系统调用都不会穿透5个级别的堆栈,甚至不会闪烁)。
如果您不使用静态变量,则可能最终不得不将堆栈深度变量传递给很多类,这对其余代码非常有侵害性。
作为一种替代方案,我建议您让它“正常”失败并抛出异常,然后在堆栈跟踪上冥想一会儿-它们确实很有用,并且可能比其他任何事物更快地引导您找到问题的根源。
static int maxDepth = 5;
public void recursiveMethod() {
if(maxDepth-- == 0)
throw new IllegalStateException("Stack Overflow");
recursiveMethod();
maxDepth++;
}
创建此类:
public class RecursionLimiter {
public static int maxLevel = 10;
public static void emerge() {
if (maxLevel == 0)
return;
try {
throw new IllegalStateException("Too deep, emerging");
} catch (IllegalStateException e) {
if (e.getStackTrace().length > maxLevel + 1)
throw e;
}
}
}
然后导入static并将insert emerge()
调用插入代码中可以进行深度递归的任何方法的开头。 您可以通过maxLevel
变量调整允许的最大递归级别。 emerge()
过程将以大于该变量值的级别中断执行。 您可以通过将maxLevel
设置为0
来关闭此行为。 该解决方案是线程安全的,因为它根本不使用任何计数器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.