您的代码似乎是从Data Structures and Algorithms in Java 书中获取的。
但是您的代码甚至无法编译,有很多语法错误和变量用词不当。您是否通过扫描 + OCR 从书中获得了该源代码,而没有尝试使用 Java 运行它?
那么首先让我们修复错误并将这段零碎的代码变成一个带有 main 方法的类,好吗?
package de.scrum_master.stackoverflow;
public class EnglishRuler {
public static void main(String[] args) {
drawRuler(2, 4);
}
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);
}
}
drawRuler(1, 3) 打印:
--- 0
-
--
-
--- 1
drawRuler(1, 5) 打印:
----- 0
-
--
-
---
-
--
-
----
-
--
-
---
-
--
-
----- 1
drawRuler(2, 4) 打印:
---- 0
-
--
-
---
-
--
-
---- 1
-
--
-
---
-
--
-
---- 2
这一切都符合预期。现在让我们为程序添加一些可选的调试输出:
package de.scrum_master.stackoverflow;
public class EnglishRuler {
private static boolean DEBUG = true;
private static String indent = "";
public static void main(String[] args) {
drawRuler(1, 3);
}
public static void drawRuler(int nInches, int majorLength) {
if (DEBUG)
System.out.println("drawRuler(" + nInches + ", " + majorLength + ")");
drawLine(majorLength, 0);
for (int j = 1; j <= nInches; j++) {
drawInterval(majorLength - 1);
drawLine(majorLength, j);
}
}
private static void drawInterval(int centralLength) {
indent += " ";
if (DEBUG)
System.out.println(indent + "drawInterval(" + centralLength + ")");
if (centralLength >= 1) {
drawInterval(centralLength - 1);
drawLine(centralLength);
drawInterval(centralLength - 1);
}
indent = indent.substring(2);
}
private static void drawLine(int tickLength, int tickLabel) {
indent += " ";
if (DEBUG)
System.out.println(indent + "drawLine(" + tickLength + ", " + tickLabel + ")");
for (int j = 0; j < tickLength; j++)
System.out.print("-");
if (tickLabel >= 0)
System.out.print(" " + tickLabel);
System.out.print("\n");
indent = indent.substring(2);
}
private static void drawLine(int tickLength) {
drawLine(tickLength, -1);
}
}
只要DEBUG 是false,这不会改变输出。如果将其设置为true,drawRuler(1, 3) 的日志将变为:
drawRuler(1, 3)
drawLine(3, 0)
--- 0
drawInterval(2)
drawInterval(1)
drawInterval(0)
drawLine(1, -1)
-
drawInterval(0)
drawLine(2, -1)
--
drawInterval(1)
drawInterval(0)
drawLine(1, -1)
-
drawInterval(0)
drawLine(3, 1)
--- 1
你有一个自动生成的试运行版本。
至于你的问题:
首先,我输入nInches = 1和majorlength = 3,
1) drawLine 将被调用 (3,0)(tickLength 和 tickLabel)
正确。
Point1:以上行的意思是调用drawInterval(2)?
正确。
第 3 点:drawLine(tickLength, -1)。为什么我们使用这个-1?
因为在drawLine(int tickLength, int tickLabel) 它说:
if (tickLabel >= 0)
System.out.print(" " + tickLabel);
因此,使tickLabel 的值小于零只是在我们不在主区间而是在其间较小的子区间时避免打印标签的一种方法。
更新:我还根据递归级别为带有调试输出的程序版本添加了缩进,并更新了日志输出以进行缩进以便 OP 更好地理解。
更新2:您可以通过内联便捷方法drawLine(int tickLength)来简化程序,如下所示:
private static void drawInterval(int centralLength) {
// ...
drawInterval(centralLength - 1);
drawLine(centralLength, -1); // Note the additional ", -1"
drawInterval(centralLength - 1);
// ...
}
然后删除这个,因为它现在不再使用了:
// Delete me!
private static void drawLine(int tickLength) {
drawLine(tickLength, -1);
}
更新 3: 因为您似乎很生气,以至于我没有为方便的方法 drawLine(int tickLength) 打印日志输出,这里是为该方法生成输出的原始程序的另一个扩展版本同样,现在完全复制您的笔和纸试运行:
package de.scrum_master.stackoverflow;
public class EnglishRuler {
private static boolean DEBUG = true;
private static String indentText = "";
public static void main(String[] args) {
drawRuler(1, 3);
}
public static void drawRuler(int nInches, int majorLength) {
debugPrint("drawRuler(" + nInches + ", " + majorLength + ")");
drawLine(majorLength, 0);
for (int j = 1; j <= nInches; j++) {
drawInterval(majorLength - 1);
drawLine(majorLength, j);
}
}
private static void drawInterval(int centralLength) {
indent();
debugPrint("drawInterval(" + centralLength + ")");
if (centralLength >= 1) {
drawInterval(centralLength - 1);
drawLine(centralLength);
drawInterval(centralLength - 1);
}
dedent();
}
private static void drawLine(int tickLength, int tickLabel) {
indent();
debugPrint("drawLine(" + tickLength + ", " + tickLabel + ")");
for (int j = 0; j < tickLength; j++)
System.out.print("-");
if (tickLabel >= 0)
System.out.print(" " + tickLabel);
System.out.print("\n");
dedent();
}
private static void drawLine(int tickLength) {
indent();
debugPrint("drawLine(" + tickLength + ")");
drawLine(tickLength, -1);
dedent();
}
private static void debugPrint(String message) {
if (DEBUG)
System.out.println(indentText + message);
}
private static void indent() {
indentText += " ";
}
private static void dedent() {
indentText = indentText.substring(2);
}
}
更新后的控制台日志变为:
drawRuler(1, 3)
drawLine(3, 0)
--- 0
drawInterval(2)
drawInterval(1)
drawInterval(0)
drawLine(1)
drawLine(1, -1)
-
drawInterval(0)
drawLine(2)
drawLine(2, -1)
--
drawInterval(1)
drawInterval(0)
drawLine(1)
drawLine(1, -1)
-
drawInterval(0)
drawLine(3, 1)
--- 1
我觉得没有必要,但如果它对你有帮助,我很高兴。