我正在使用Java中的递归构建英语标尺。在使用drawRuler函数绘制刻度线时,我遇到了一个问题,即当值为0时,控件将如何执行以下语句。我的基本条件是:
if(centalLength> = 1)并且递归调用位于此控制语句内。在drawInterval(centralLength-1)中面临的问题。任何人都可以提供帮助,我想了解基本情况得到满足后将如何处理。

public static void drawRuler(int nInches, int majorLength) {

        drawLine(majorLength, 0);

        for(int j = 1; j <= nInches; j++) {
            drawInterval(majorLength - 1);
            drawLine(majorLength, j);
        }
    }

    private static void drawInterval(int centralLength) {

        if (centralLength >= 1) {
            drawInterval(centralLength - 1);
            drawLine(centralLength);
            drawInterval(centralLength - 1);
        }
    }

    private static void drawLine(int tickLength, int tickLabel) {

        for (int j = 0; j < tickLength; j++)
            System.out.print("-");

        if (tickLabel >= 0)
            System.out.print(" " + tickLabel);

        System.out.print("\n");

    }

    private static void drawLine(int tickLength) {

     drawLine(tickLength, -1);

 }


该代码没有错误。我想了解在满足基本条件后下一条语句将如何执行。

最佳答案

drawInterval(majorLength - 1)drawInterval(centralLength - 1);用0调用时,绘制间隔调用将被跳过,在drawLine(majorLength, j)处绘制线j <= nInches次。因此,您的递归不好-在任何地方都不应存在循环,它本身就是循环。

例如,drawRuler(1, 99)将在1处绘制99条线。

这是需要采取的步骤:

它在0处调用绘制线,然后初始化for循环。

for循环的第一次迭代majorLength-1为零,因此绘制间隔为无操作。

然后调用1和0绘制线。

然后它循环,并且majorLength-1仍为零,因此绘制间隔为无操作,绘制线被称为1和1。

然后它再次循环直到j = 99,每次都调用绘制线(1,j),从而绘制了99条线。

您遇到的任何问题都与递归和循环的混合有关。您必须非常小心。

07-24 09:24