Выполнение следующих утверждений при соблюдении базового варианта - PullRequest
2 голосов
/ 28 сентября 2019

Я строю английского правителя, используя рекурсию в Java.При рисовании тиков с использованием функции drawRuler я столкнулся с проблемой, что когда значение равно 0, то как элемент управления выполнит следующие операторы.Мое базовое условие: if (centalLength> = 1) и рекурсивный вызов находится внутри этого управляющего оператора.Столкнувшись с проблемой в drawInterval (centralLength - 1).Любой может помочь, я хочу понять, что будет сделано после того, как базовый случай будет выполнен.

public static void drawRuler(int nInches, int majorLength) { 

        drawLine(majorLength, 0);      

        for(int j = 1; j <= nInches; j++) { 
            drawInterval(majorLength - 1);     
            drawLine(majorLength, j);      
        } 
    } 

    private static void drawInterval(int centralLength) { 

        if (centralLength >= 1) {           
            drawInterval(centralLength - 1);     
            drawLine(centralLength); 
            drawInterval(centralLength - 1); 
        }
    } 

    private static void drawLine(int tickLength, int tickLabel) { 

        for (int j = 0; j < tickLength; j++)
            System.out.print("-");

        if (tickLabel >= 0)
            System.out.print(" " + tickLabel);

        System.out.print("\n");

    }

    private static void drawLine(int tickLength) { 

     drawLine(tickLength, -1);

 }

Код не содержит ошибок.Я хочу понять, как будут выполняться следующие операторы после выполнения базового условия.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

когда L = 0 , который ничего не рисует.Для L≥1 первый и последний шаги выполняются путем рекурсивного вызова drawInterval (L-1) .Средний шаг выполняется путем вызова метода drawLine (L) .

0 голосов
/ 28 сентября 2019

Когда drawInterval(majorLength - 1) или drawInterval(centralLength - 1); вызывается с 0, вызовы интервала отрисовки будут пропущены, а рисование линий будет drawLine(majorLength, j) для j <= nInches раз.Так что ваша рекурсия плохая - нигде не должно быть цикла, это сам цикл.

Например, drawRuler(1, 99) нарисует 99 линий в 1.

Вот шаги, которые нужно предпринять:

Вызывает рисование линии в 0, затем инициализирует цикл for,

Первая итерация цикла for, majorLength - 1, равна нулю, поэтому интервал отрисовки не используется.

Затем он вызывает линию рисования с 1 и 0.

Затем он зацикливается, и majorLength - 1 по-прежнему равен нулю, поэтому интервал рисования no-ops, и линия рисования вызывается с 1 и 1.

Затем он повторяется до j = 99, каждый раз вызывая рисовать линию (1, j), таким образом рисуя 99 линий.

Любые проблемы, с которыми вы сталкиваетесь, связаны с смешением рекурсии и циклов.Вы должны быть чрезвычайно осторожны с этим.

...