Как рекурсивно разрезать бумагу? - PullRequest
0 голосов
/ 19 июня 2020

Я делаю задание по рекурсии и действительно застрял в этом вопросе ..

Бумага формата A4. Отношение ширины к высоте бумаги в формате ISO составляет квадрат root 2: 1. Формат A0 имеет площадь 1 квадратный метр. Формат A1 - это A0, разрезанный вертикальной линией на две равные половины, A2 - это A1, разрезанный горизонтальной линией на две половины, и так далее. Напишите программу, которая принимает целочисленный аргумент командной строки n и использует StdDraw, чтобы показать, как разрезать лист бумаги A0 на 2 ^ n частей.

StdDraw - это просто библиотека для рисования чего-то специально созданного на холсте на курс. В этом случае мы можем использовать StdDraw, чтобы нарисовать линию, изображающую разрезание бумаги.

1 Ответ

1 голос
/ 20 июня 2020

Исходя из вашего вопроса и предоставленной вами ссылки, я думаю, что 2 n следует заменить на 2n, и если это так, то следующий рекурсивный метод stati c дает желаемый результат:

public static void papercut(int n, double size, double x, double y)
{
    if (n == 0) return;
    double x2 = x + size, y2 = y + 2*size;
    StdDraw.line(x, y, x, y+4*size);
    StdDraw.line(x-2*size, y, x+2*size, y);
    papercut(n-1, size/2, x2, y2);  
}

Вы можете протестировать его с помощью:

public static void main(String[] args)
{
    int n = Integer.parseInt(args[0]);
    papercut(n, 0.25, 0.5, 0);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...