Невозможно понять рекурсивные вызовы функций - PullRequest
0 голосов
/ 19 января 2020

Я новичок в программировании и изучал рекурсивные функции из "Введение в Java Программирование ~ Лян". Хотя рекурсивные функции очаровывают меня, я думаю, что не могу полностью понять, как вызовы методов работают внутри.

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

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

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

Я прилагаю код и изображения, которые создает рекурсивный метод

enter image description here

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 раз даже до того, как я помещу какие-либо числа в предоставленное место. Почему это так?

...