我正在使用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条线。
您遇到的任何问题都与递归和循环的混合有关。您必须非常小心。