Параметры рекурсии Java

Я застрял с домашним заданием; у кого-нибудь есть идея?

Задача: Реализовать рекурсивный метод boxed(двойной[] центр, двойной радиус), который рисует фигуру следующим образом:

введите здесь описание изображения

(Внешний квадрат — это край изображения.) Центр массива содержит координаты x и y центра всех квадратов, тогда как радиус равен половине длины квадрата. Внутренние квадраты всегда повернуты на 45°. Метод должен прекратить рисование, когда радиус меньше одного пикселя.

Были даны другие методы. Этот рисует квадрат, повернутый на двойной угол:

private static void squareRotated(double[] center, double radius, double angle) {
        double[] upperLeft = {-radius, radius};
        double[] upperRight = {radius, radius};
        double[] lowerLeft = {-radius, -radius};
        double[] lowerRight = {radius, -radius};


        double[] rotUpperLeft = rotatePoint(upperLeft,angle);
        double[] rotUpperRight = rotatePoint(upperRight,angle);
        double[] rotLowerLeft = rotatePoint(lowerLeft,angle);
        double[] rotLowerRight = rotatePoint(lowerRight,angle);


        StdDraw.polygon(new double[]{rotUpperLeft[0]+center[0],rotUpperRight[0]+center[0],
                        rotLowerRight[0]+center[0],rotLowerLeft[0]+center[0]},
                        new double[]{rotUpperLeft[1]+center[1],rotUpperRight[1]+center[1],
                        rotLowerRight[1]+center[1],rotLowerLeft[1]+center[1]});
    }

Этот поворачивает точку на двойной угол:

private static double[] rotatePoint(double[] point, double angle) {
        double[] result = new double[2];
        result[0] = point[0]*Math.cos(angle) - point[1]*Math.sin(angle);
        result[1] = point[0]*Math.sin(angle) + point[1]*Math.cos(angle);
        return result;
    }
}

Это мой код:

private static double angle = 0;

    private static void boxed(double[] center, double radius) {
        if (radius > (double) 1/512) {
            squareRotated(center, radius, angle);
            angle += Math.PI/4;
            boxed(center, Math.sqrt(radius*radius + radius*radius)/2);
        }
    }

Это работает, но есть ли способ избежать частного статического двойного угла? Мне не разрешено добавлять в метод третий параметр, и я должен решать его с помощью рекурсии.


person Leila    schedule 03.01.2018    source источник
comment
Похоже, это должно быть в CodeReview...   -  person MordechayS    schedule 03.01.2018
comment
Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, поскольку он относится к Code Review.   -  person Jim Garrison    schedule 03.01.2018


Ответы (1)


Обычный метод здесь состоит в том, чтобы иметь один public метод, который предоставляет доступ к API, который затем вызывает private метод для фактического выполнения рекурсивного процесса, передавая ему начальные условия.

// The private one that actually does the recursive process.
private static void boxed(double[] center, double radius, double angle) {
    if (radius > 1.0 / 512.0) {
        squareRotated(center, radius, angle);
        angle += Math.PI / 4.0;
        boxed(center, Math.sqrt(radius * radius + radius * radius) / 2.0, angle);
    }

}

// The public one to provide the API.
public static void boxed(double[] center, double radius) {
    boxed(center, radius, 0.0);
}

NB: я не проверял этот код — это просто для демонстрации метода.

person OldCurmudgeon    schedule 03.01.2018
comment
Спасибо, но боюсь, мне не разрешено это делать. Мне нужно реализовать только один метод. - person Leila; 03.01.2018
comment
@Лейла - Ты уверен? Это кажется мне очень контрпродуктивным упражнением, если только они не хотят, чтобы вы увидели, как эта техника работает лучше в следующем задании, когда они позволяют вам использовать два метода. - person OldCurmudgeon; 03.01.2018
comment
Думаю да... Иначе в описании задачи была бы подсказка. Есть ли другое решение? - person Leila; 03.01.2018