這裏打印數是問題要求奇怪的邏輯向後
編寫接受整數參數n,並打印所述第一n個整數按順序從1開始,以逗號分隔的方法writeNums。例如,下面的呼叫產生以下輸出:
調用輸出 writeNums(5); 1,2,3,4,5
這裏是一個解決方案(部分是我的工作和部分,我在網上搜索)。我不明白爲什麼這行寫了Num(n - 1);向後打印數字?這是一個有點混亂,因爲我期待得到這個印刷: 5,4,3,2,1
這裏打印數是問題要求奇怪的邏輯向後
編寫接受整數參數n,並打印所述第一n個整數按順序從1開始,以逗號分隔的方法writeNums。例如,下面的呼叫產生以下輸出:
調用輸出 writeNums(5); 1,2,3,4,5
這裏是一個解決方案(部分是我的工作和部分,我在網上搜索)。我不明白爲什麼這行寫了Num(n - 1);向後打印數字?這是一個有點混亂,因爲我期待得到這個印刷: 5,4,3,2,1
它,因爲你正在使用遞歸,您打印輸出是函數調用之後。
之前函數調用讓它和你將得到5,4,3,2,1
這樣的:
public static void writeNums(int n) {
if (n == 1)
System.out.print("1");
else {
System.out.print(n+", ");
writeNums(n - 1);
//System.out.print(", " + n);
}
}
謝謝!我認爲你的回覆幾乎解決了我的困惑。我現在正在刷牙遞歸技巧 –
很高興幫助!,我知道遞歸有時會令人困惑。 –
你能接受它作爲你的答案嗎? –
程序向後打印的數字,因爲你要求它打印數字落後。看到在你的遞歸調用第一次迭代中,您先打印n
,然後用n-1
開始。如果你想在升序打印的號碼,你的方法更改爲類似如下:
public static void writeNums(int m, int n) {
if(n < 1) return;
System.out.print(m);
if(m == n) return;
writeNums(m+1, n);
}
然後從您的主要方法,調用該函數爲writeNums(1, <n>);
你的程序產生的輸出如下:
5
4
3
2
1, 2, 3, 4, 5
它爲什麼這樣做?
5
4
3
2
1
來自System.out.println(n);
行。你打電話writeNums(5)
,要求再writeNums(4)
,這使得另一遞歸調用之前在新行調用writeNums(3)
等每次調用打印n
。
此部分:, 2, 3, 4, 5
在遞歸調用完成後由行System.out.print(", " + n);
打印。所以writeNums(2)
將調用writeNums(1)
返回後打印, 2
,writeNums(3)
會如果你希望程序打印1, 2, 3, 4, 5
只是刪除System.out.println(n);
線路的呼叫後打印, 3
到writeNums(2)
回報等
。
的號碼向後打印出來,因爲您在打印號碼前調用相同的方法,它會自己運行,直到滿足「如果(N == 0)」,並在這種情況下,將完成本身就能繼續執行下一行 「是System.out.print(」, 「+ N)」。所以,這樣打印所有的序列。
public static void writeNums(int n) {
if (n == 0){
throw new IllegalArgumentException();
}
else if (n == 1) {
System.out.print(n);
} else {
writeNums(n-1);
System.out.print(", " + n);
}
}
查看遞歸和遞歸調用堆棧 – Coder
當您逐步完成代碼時,調試器顯示的內容是什麼? –
如果number不是1,它再次調用writeNum(n-1),但是爲什麼system.out以相反的順序打印? –