Java练习:使用递归方法打印星号三角形及其倒三角形

我需要打印一个三角形和倒三角形(站在它的尖端)。 我设法只打印出三角形。 我知道我可以很容易地使用for循环,但我想知道如何使用递归,在我的情况下,我不知道如何打印三角形和倒置的一个。谢谢。

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: * ** *** **** 

你必须重新考虑这个问题,这可能是一个可能的解决方案:

 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; }} 

我建议将生成的String的创建与打印分开。 这将允许您使用结果执行任何其他操作,并且可能更有效。 同样为了提高效率,建议使用StringBuilder ,因为它可以避免创建和丢弃许多String对象。 同样为了提高效率,更喜欢附加单个char而不是带有单个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); }