2017-02-16 93 views
-2

這裏打印數是問題要求奇怪的邏輯向後

編寫接受整數參數n,並打印所述第一n個整數按順序從1開始,以逗號分隔的方法writeNums。例如,下面的呼叫產生以下輸出:

調用輸出 writeNums(5); 1,2,3,4,5

這裏是一個解決方案(部分是我的工作和部分,我在網上搜索)。我不明白爲什麼這行寫了Num(n - 1);向後打印數字?這是一個有點混亂,因爲我期待得到這個印刷: 5,4,3,2,1

​​
+0

查看遞歸和遞歸調用堆棧 – Coder

+0

當您逐步完成代碼時,調試器顯示的內容是什麼? –

+0

如果number不是1,它再次調用writeNum(n-1),但是爲什麼system.out以相反的順序打印? –

回答

2

它,因爲你正在使用遞歸,您打印輸出是函數調用之後。

之前函數調用讓它和你將得到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); 
    } 
    } 
+0

謝謝!我認爲你的回覆幾乎解決了我的困惑。我現在正在刷牙遞歸技巧 –

+0

很高興幫助!,我知道遞歸有時會令人困惑。 –

+0

你能接受它作爲你的答案嗎? –

0

程序向後打印的數字,因爲你要求它打印數字落後。看到在你的遞歸調用第一次迭代中,您先打印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>);

1

你的程序產生的輸出如下:

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)返回後打印, 2writeNums(3)會如果你希望程序打印1, 2, 3, 4, 5只是刪除System.out.println(n);線路的呼叫後打印, 3writeNums(2)回報等

0

的號碼向後打印出來,因爲您在打印號碼前調用相同的方法,它會自己運行,直到滿足「如果(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); 
        } 
    }