Стек начинается с 0 или 1? - PullRequest
1 голос
/ 02 мая 2019

Поэтому мне было любопытно, смогу ли я реализовать ограничение рекурсии для Java, и обнаружил этот код по ссылке: Установить максимальную глубину рекурсии в java

Какое число выполняет getStackTrace ().длина начала отсчета?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 () ["first iteration"], он будет добавлен в стек?Даже тогда не должно ли printRecursively (9) использовать только 9 «уровней стека»?

1 Ответ

0 голосов
/ 02 мая 2019

getStackTrace () - очень медленный метод (именно поэтому исключения считаются медленными). Никогда не используйте его для нормального выполнения программы ( Эффективная Java, позиция 57 ). Если вы хотите реализовать предел рекурсии, укажите обратный счетчик для рекурсивного метода:

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

    System.out.println(n);
    printRecursively(n-1, depth - 1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...