2016-07-24 81 views
0

遞歸後遞歸的目標是打印前行的長度的一半出來,直到它到達0,然後扭轉它。例如,如果原來的尺寸輸入爲5,結果是:如何使扭轉的Java

***** 
** 
* 

* 
** 
***** 

所以我寫了一個程序一樣

void print(int size) { 

    if (size == 1) { 
     System.out.print("*"); 
     System.out.println();   
    } 

    if (size > 1) { 
     for (int i = 0; i < size; i++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 
     size = (int)(size/2); 
     print(size); 
    } 
} 

結果出來與

***** 
** 
* 

什麼使用遞歸來逆轉結果的最好方法(第二部分)?

感謝

+0

將打印循環之後您調用''以及之前打印(大小)。 –

回答

0

您可以實現只在一個方式打印。當您的代碼達到堆棧 沒有任何反應。詳細瞭解遞歸實際如何工作,以及當您的調用方法遞歸時發生了什麼。

,以實現自己的目標的最佳方式(根據您的代碼)是:

static void print(int size) { 
    if (size == 0) { 
     System.out.println(); 
    } else { 
     for (int i = 0; i < size; i++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 

     print(size/2); 

     //when stack ends point of execution will go to next statement 
     //(stack ends when size==0, after that will be performed size==1, and size=2, size== 5, eop) 
     for (int i = 0; i < size; i++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 
    } 
} 
+0

這是一個很好的答案。謝謝! – user2029709

+0

@ user2029709我很高興能幫上忙。 –

0

您第一現有方法打印的星星,然後前往下一個遞歸級別,這就好比在遍歷二叉樹第一序遍歷

要撤消結果,只需使用「後序遍歷」 - 先訪問下一個遞歸級別,然後打印。

在下面的例子中,我感動print(size/2)語句後System.out.print("*")語句。它應該達到你想要的。

static void print(int size) { 
    if(size==1){ 
     System.out.print("*"); 
     System.out.println(); 
    } 

    if(size>1){ 
     print(size/2); 
     for (int i = 0; i < size; i++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 
    } 
} 
0

你將不得不使用蓄電池作爲身份和進行

void printReverse(int ident, int size) { 
    if (ident <= size) { 
     // quick hack , on the border case change it to the odd int 
     if (ident < size && ident * 2 > size) { 
      ident = size; 
     } 
     for (int i = 0; i < ident; i++) { 
      System.out.print("*"); 
     } 
     System.out.println(); 
     printReverse(ident * 2, size); 
    } 

} 
0

你的遞歸函數可以採取兩個輸入:

void print(int _current, int _start){ 

    if(_current < -_start){ 
     return; 
    } 

    for(int i = 0; i < Math.abs(_current); i++){ 
     System.out.print("*"); 
    } 
    System.out.println(); 
    if(_current > 0){ 
     print(_current/2, _start); 
    } else if(_current == 0){ 
     print(-1, _start); 
    } else{ 
     print(_current * 2, _start); 
    } 
} 

編輯: 在你的情況下, 「主」電話將是打印(5,5);

+0

它將在第二組中打印四個星號而不是五個。 –

0

使用StringBuilder建立自己的字符串和Stack收集它們的反向輸出:

static void print(int size, Stack<String> stack) { 
    if (size == 1) { 
     System.out.println("*"); 
     stack.push("*"); 
    } else if (size > 1) { 
     StringBuilder sb = new StringBuilder(size); 
     for (int i = 0; i < size; i++) { 
      sb.append("*"); 
     } 
     String s = sb.toString(); 
     System.out.println(s); 
     stack.push(s); 
     print(size/2, stack); 
    } 
} 

public static void main(String[] args) { 
    Stack<String> stack = new Stack<>(); 
    print(5, stack); 
    while (!stack.isEmpty()) { 
     System.out.println(stack.pop()); 
    } 
}