2015-11-04 75 views
1

我需要打印一個三角形及其倒三角形(站在其尖端)。我設法只打印出三角形。我知道我可以很容易地使用循環,但我想知道如何使用遞歸,在我的情況下,我不知道如何打印這兩個三角形和倒轉的一個。謝謝。Java練習:使用遞歸方法打印星號三角形及其倒三角形

Example desired output: 
* 
** 
*** 
**** 
**** 
*** 
** 
* 

我的代碼:

public class Recursion1 { 
    public static void main(String[] args) { 
     Recursion1 me = new Recursion1(); 
     me.doIt(); 
    } 

    public void doIt() {   
     nums(4); 
    } 

    public String nums(int counts) { 
     if (counts <= 0) { 
      return ""; 
     } 

     String p = nums(counts - 1); 
     p = p +"*"; 
     System.out.print(p); 
     System.out.println(); 

     return p; 
    } 
} 

我的結果:

Results: 
* 
** 
*** 
**** 
+1

再次做,但是相反。如果你想了一會兒,你會看到如何去做。 –

回答

1

你不得不重新考慮這個問題,這可能是一個可能的解決方案:

public class Recursion1 { 
private static int endValue; 
private static int startValue = 1 ; 

public Recursion1(int endValue){ 
    Recursion1.endValue = endValue; 
} 

public static void main(String[] args) { 
    Recursion1 me = new Recursion1(4); 
    me.doIt(); 
} 

public void doIt() {   
    nums("*"); 
} 

public String nums(String value) { 
    if(startValue == endValue){ 
     System.out.println(value); 
    }else{ 
     System.out.println(value); 
     startValue ++; 
     value = value.concat("*"); 
     nums(value); 
     value = value.substring(1); 
     System.out.println(value); 
    } 
    return value; 
}} 
+0

謝謝你的迴應。你能詳細說明一下公共的String nums方法嗎?我不太清楚這種方法背後的原因。而且,上面的代碼在打印星號方面做得相當不錯,但它似乎只是從一個星號(*)打印出來,最多可以顯示4個星號(****),並且不會重複打印出4個星號(** **)將病房放回一個星號(*),而打印出來後(****),它只打印三張(***)。我試圖調整編號和東西,但仍然無法弄清楚如何打印完全像我的帖子。謝謝 –

0

我會建議保留由此產生的String與打印分開。這將允許你做任何你想要的結果,並且它可能更有效率。同樣爲了提高效率,建議使用StringBuilder,因爲它避免了創建和丟棄許多String對象。另外爲了提高效率,還需要在單個字符上附加單個char而不是String

這是一個解決這些問題的方法。您將參數初始化爲零,行數和新的StringBuilder。附加的*的數量增加了多達一半的行數,然後減少。每個遞歸調用都附加新行。

public void doIt() { 
    String p = nums(0, 7, new StringBuilder()); 
    System.out.print(p); 
} 

public String nums(int counts, int lines, StringBuilder b) { 
    if (counts == lines) 
     return b.toString(); 

    int size = counts < lines/2 ? 
       counts : 
       lines - counts - 1; 

    for (int i = 0; i < size + 1; ++i) 
     b.append('*'); 
    b.append('\n'); 

    return nums(counts + 1, lines, b); 
}