Я новичок в программировании и изучал рекурсивные функции из "Введение в Java Программирование ~ Лян". Хотя рекурсивные функции очаровывают меня, я думаю, что не могу полностью понять, как вызовы методов работают внутри.
Я понимаю, что как только метод достигает базового случая и выполняет все, что упомянуто в его логике c , он передает элемент управления предыдущему методу, который его вызвал (это тот же метод в рекурсии).
Для лучшего понимания я разработал пример программы и использовал отладку, чтобы увидеть, как элемент управления переходит из одного метода позвони другому. Все это выглядит очень интересно, потому что вызовы выполняются от одного метода к одному и тому же методу из его тела.
Однако, одну вещь, которую я до сих пор не могу понять, - это почему некоторые операторы выполняются из базовый случай, даже если условие базового случая еще не достигнуто.
Я прилагаю код и изображения, которые создает рекурсивный метод
enter code here
package Ch18;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class MyRecursiveCircles2 extends Application {
@Override
public void start(Stage stage) throws Exception {
CirclePane2 circlePane = new CirclePane2();
TextField tfOrder = new TextField();
tfOrder.setOnAction(e -> circlePane.setCircleCount(Integer.parseInt(tfOrder.getText())));
tfOrder.setPrefColumnCount(4);
tfOrder.setAlignment(Pos.BOTTOM_LEFT);
HBox hbox = new HBox(10);
hbox.getChildren().addAll(new Label("Enter order: "), tfOrder);
hbox.setAlignment(Pos.CENTER);
BorderPane rootPane = new BorderPane();
StackPane spCircle = new StackPane();
StackPane spTexts = new StackPane();
spCircle.setPadding(new Insets(10));
spCircle.getChildren().add(circlePane);
spTexts.setPadding(new Insets(10));
spTexts.getChildren().add(hbox);
rootPane.setCenter(spCircle);
rootPane.setBottom(spTexts);
Scene scene = new Scene(rootPane, 400, 400);
scene.widthProperty().addListener(ov -> circlePane.createCircle());
scene.heightProperty().addListener(ov -> circlePane.createCircle());
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
class CirclePane2 extends Pane {
private int count;
private double radius;
public CirclePane2() {
this.count = 0;
}
public void setCircleCount(int count) {
this.count = count;
createCircle();
}
public void createCircle() {
double xPos = getWidth() / 2;
double yPos = getHeight() / 2;
radius = getHeight() / 2;
getChildren().clear();
displayCircle(count, xPos, yPos, radius);
}
public void displayCircle(int count, double xPos, double yPos, double radius) {
if (count == 0) {
Circle circle = new Circle(xPos, yPos, radius);
// circle.setStroke(Color.BLACK);
circle.setStroke(null);
circle.setFill(new Color(0.0, 0.5, 0.0, 0.5));
// circle.setFill(null);
this.getChildren().add(circle);
System.out.println("Hello World"); <-------== WHY??
} else {
displayCircle(count - 1, xPos - (radius / 2), yPos, radius - (radius / 2));
displayCircle(count - 1, xPos + (radius / 2), yPos, radius - (radius / 2));
displayCircle(count - 1, xPos, yPos - (radius / 2), radius - (radius / 2));
displayCircle(count - 1, xPos, yPos + (radius / 2), radius - (radius / 2));
//
// displayCircle(count - 1, xPos - (radius / 2), yPos - (radius / 2), radius - (radius / 2));
// displayCircle(count - 1, xPos + (radius / 2), yPos + (radius / 2), radius - (radius / 2));
// displayCircle(count - 1, xPos + (radius / 2), yPos - (radius / 2), radius - (radius / 2));
// displayCircle(count - 1, xPos - (radius / 2), yPos + (radius / 2), radius - (radius / 2));
}
}
}
Этот код также содержит некоторый закомментированный текст кода, с которым я экспериментировал. Когда я запускаю приведенный выше код, он работает так, как я хочу, но печатает Hello World 8 раз даже до того, как я помещу какие-либо числа в предоставленное место. Почему это так?