【问题标题】:Does a stack start on 0 or 1?堆栈是从 0 开始还是从 1 开始?
【发布时间】:2019-09-20 22:01:04
【问题描述】:

所以我很好奇是否可以对 Java 实现递归限制,并在链接中发现了这段代码: Set maximum recursion depth in java

getStackTrace().length 从几开始计数? 0 还是 1? “堆栈”从几号开始? 0 还是 1?

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;
        }
    }
}
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) {
                System.out.println(e.getStackTrace().length);
                throw e;
            }
        }
    }
}
public static void main(String[] args) {
        // TODO code application logic here
        printRecursively(8);

    }

    public static void printRecursively(int n) {
        RecursionLimiter.emerge();
        if (n == 1) {
            System.out.println(1);
            return;
        }
        System.out.println(n);
        printRecursively(n-1);


    }

我使用了以上两个类,它似乎停止在 printRecursively(9) [in main()];这意味着自从抛出异常以来堆栈已经达到 10。

后台发生了什么? 通过运行 printRecursively() [“第一次迭代”],它是否被添加到堆栈中?即使那样 printRecursively(9) 不应该只使用 9 个“堆栈级别”吗?

【问题讨论】:

  • 索引从 0 开始
  • @AxelH 从你的意思来看,我知道,虽然索引从 0 开始,但它充满了一个“虚拟”条目,使实际的第一项索引从 1 开始。是正确的(同样,这也适用于每个 Collection 实现)。
  • 写错字了!我移除了那个怪物。长度只是计算Stack 中的项目数。所以空栈的长度为0。添加项目时,该项目的索引为0,堆栈的长度为1。其中有一个新项目,length = 2index = 1
  • @AxelH 好的,谢谢。然后它的工作方式类似于普通数组:)

标签: java recursion stack


【解决方案1】:

getStackTrace() 是一个非常慢的方法(这就是异常被视为慢的原因)。切勿将其用于正常的程序流程 (Effective Java, item 57)。如果要实现递归限制,请为递归方法提供一个递减计数器:

public static void printRecursively(int n, int depth) {
    if (depth == 0)
        ... stop recursing

    System.out.println(n);
    printRecursively(n-1, depth - 1);
}

【讨论】:

  • 感谢您的建议!我没有考虑这方面(应用程序的速度)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-25
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多