2014-09-22 96 views
0

任何人都可以請解釋遞歸循環的打印順序嗎?解釋遞歸循環的打印輸出順序?

import java.util.Scanner; 

public class DecimalToBinary { 
    static Scanner console = new Scanner(System.in); 

    public static void main(String[] args) { 
     int decimalNum; 
     int base; 
     base = 2; 
     System.out.println("Enter a nonnegative integer in decimal: "); 
     decimalNum = console.nextInt(); 
     System.out.println(); 
     System.out.println("Decimal " + decimalNum + " = "); 
     decToBin(decimalNum, base); 
     System.out.println(" binary"); 
    } 

    public static void decToBin(int num, int base) { 
     if (num == 0) { 
      System.out.print(0); 
     } else if (num > 0) { 
      decToBin(num/base, base); 
      System.out.print(num % base); 
     } 
    } 
} 


Num % base必須打印相反的順序是這樣的:

enter image description here


爲什麼如圖所示調用的順序? (請幫我修改我的問題,英文是我的外語)

回答

3

您的打印發生在遞歸之後。使用(25,2)爲例,與打印您的通話順序看起來像

decToBin(25, 2): 
    decToBin(12,2): 
     decToBin(6,2): 
      decToBin(3,2): 
       decToBin(1,2): 
        decToBin(0,2): 
         print(0) 
        print(1%2) 
       print(3%2) 
      print(6%2) 
     print(12%2) 
    print(25%2) 

卸下遞歸調用,只是離開打印報表顯示你所得到的順序:

decToBin(25, 2): 
    print(0) 
    print(1%2) 
    print(3%2) 
    print(6%2) 
    print(12%2) 
    print(25%2) 

如果你想在打印中以相反的順序,將打印語句之前的遞歸調用:

public static void decToBin(int num, int base) { 
    if (num == 0) { 
     System.out.print(0); 
    } else if (num > 0) { 
     System.out.print(num % base); 
     decToBin(num/base, base); 
    } 
} 

新遞歸w ^第i個印刷:

​​

新的輸出:

decToBin(25, 2): 
    print(25%2) 
    print(12%2) 
    print(6%2) 
    print(3%2) 
    print(1%2) 
    print(0) 
1

輸出的順序顛倒 因爲一旦dectobin函數被調用

decToBin(int num, int base) { 
    if (num == 0) { 
     System.out.print(0); 
    } else if (num > 0) { 

到達線

decToBin(num/base, base); 

它推遲其執行,並呼籲「另一實例」的dectobin功能與下降數參數,得到一個機會,輸出任何東西之前(在下面的代碼)

 System.out.print(num % base); 
    } 

那麼這個後續dectobin呼叫停止在同一行和另一個「實例」以更小的數字開始。等等等等。迄今沒有任何「實例」有機會打印任何內容。

在某些時候,最後啓動的函數的「實例」認識到它的 num參數在值1下減少;而且由於num是整數類型,一旦它是正的,但小於1是「四捨五入」爲0,使以下條件爲真:

if (num == 0) { 
     System.out.print(0); 

那麼這最後一個實例從它的所有的前任不同的行爲方式。不是推遲它的執行並創建一個新的「實例」,而是在上面的行中打印出'0',而只是結束時將執行點返回給調用它的那個「實例」,然後繼續從它被推遲的行中運行。 那麼這個「實例」輸出其數目

 system.out.print(num % base); 

並結束本身返回執行向其中啓動它的一個。等等。

底線是:最後開始的功能「實例」有第一個輸出,最先啓動的功能有最後一個