1 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
你的代碼甚至無(wú)法編譯,有很多語(yǔ)法錯(cuò)誤和變量用詞不當(dāng)。您是否通過(guò)掃描 + OCR 從書中獲取了源代碼,而沒有嘗試使用 Java 運(yùn)行它?
因此,首先讓我們修復(fù)錯(cuò)誤,并將這段零散的代碼變成一個(gè)帶有 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
這一切都在預(yù)料之中?,F(xiàn)在讓我們向程序添加一些可選的調(diào)試輸出:
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只要是,這就不會(huì)改變輸出false。如果將其設(shè)置為true,則日志將drawRuler(1, 3)變?yōu)椋?/p>
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
在那里你有一個(gè)自動(dòng)生成的試運(yùn)行版本。
至于你的問(wèn)題:
第一次,我進(jìn)入nInches = 1并且majorlength = 3,
1)drawLine將用(3,0)(tickLength和tickLabel)調(diào)用
正確的。
Point1:上面那行的意思是會(huì)調(diào)用drawInterval(2)?
正確的。
第3點(diǎn):drawLine(tickLength, -1). 我們?yōu)槭裁从眠@個(gè)-1?
因?yàn)槔锩鎑rawLine(int tickLength, int tickLabel)說(shuō):
? ? if (tickLabel >= 0)
? ? ? System.out.print(" " + tickLabel);
因此,使值tickLabel小于零只是當(dāng)我們不在主間隔而是在其間較小的子間隔時(shí)避免打印標(biāo)簽的一種方法。
更新:我還根據(jù)遞歸級(jí)別向具有調(diào)試輸出的程序版本添加了縮進(jìn),并且還更新了日志輸出以縮進(jìn),以便OP更好地理解。
更新 2:您可以通過(guò)內(nèi)聯(lián)便捷方法來(lái)簡(jiǎn)化程序,drawLine(int tickLength)如下所示:
? private static void drawInterval(int centralLength) {
? ? // ...
? ? ? drawInterval(centralLength - 1);
? ? ? drawLine(centralLength, -1);? // Note the additional ", -1"
? ? ? drawInterval(centralLength - 1);
? ? // ...
? }
然后刪除這個(gè),因?yàn)楝F(xiàn)在它不再使用了:
? // Delete me!
? private static void drawLine(int tickLength) {
? ? drawLine(tickLength, -1);
? }
更新 3:因?yàn)槟坪鯇?duì)我沒有為方便方法打印日志輸出感到非常惱火drawLine(int tickLength),所以這里也是為該方法生成輸出的原始程序的另一個(gè)擴(kuò)展版本,現(xiàn)在完全復(fù)制您的筆和紙?jiān)囘\(yùn)行:
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);
? }
}
更新后的控制臺(tái)日志變?yōu)椋?/p>
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
我發(fā)現(xiàn)這是不必要的,但如果它對(duì)你有幫助,我很高興。
添加回答
舉報(bào)