Каждый раз, когда вы вызываете n--
, вы передаете n
функции и затем уменьшаете ее на единицу для следующего вызова.Вместо этого вам нужно передать n - 1
каждому вызову, так как сам вызов будет уменьшаться на n
дальше в своем собственном рекурсивном вызове, в конечном итоге останавливаясь на 0
, как вы правильно сделали.
Для четырех кардиналовТочки, используя (x + d, y)
, (x, y + d)
, (x - d, y)
и (x, y - d)
, работают правильно, но для четырех диагональных точек вам нужно будет использовать либо квадратный корень (Math.sqrt
) для метода Пифагора, либо синуси косинус (Math.sin
и Math.cos
) для тригонометрического метода.Использование (x + d, y + d)
и т. П. Вместо этого поместит их в квадрат.
Если предположить, что x
и y
отмечают центр вашего круга, ваша функция станет:
private static void banachCurve(final double x, final double y, final double r, final int n) {
if (n == 0) {
return;
}
final double d = r / 3;
StdDraw.circle (x, y, d);
banachCurve (x, y, d, n - 1); // centre
banachCurve (x, y + d, d, n - 1); // north
banachCurve (x + d, y, d, n - 1); // east
banachCurve (x, y - d, d, n - 1); // south
banachCurve (x - d, y, d, n - 1); // west
// Get the diagonal radius for a point at 45 degrees on the circle
final double diagD = Math.cos(Math.toRadians(45)) * d;
banachCurve (x + diagD, y + diagD, d, n - 1); // north-east
banachCurve (x + diagD, y - diagD, d, n - 1); // south-east
banachCurve (x - diagD, y - diagD, d, n - 1); // south-west
banachCurve (x - diagD, y + diagD, d, n - 1); // north-west
}
Вот вывод для banachCurve(0.5, 0.5, 1, 6);
: