2015-11-04 381 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); 
}