【问题标题】:Java Exercise: Printing asterisks Triangle and its inverted triangle using recursion methodJava 练习:使用递归方法打印星号三角形及其倒三角形
【发布时间】:2016-02-05 02:50:33
【问题描述】:

我需要打印一个三角形和它的倒三角形(站在它的尖端)。我设法只打印出三角形。我知道我可以轻松地使用 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:
*
**
***
****

【问题讨论】:

  • 再做一次,但反过来。如果你想一想,你就会知道该怎么做。

标签: java for-loop recursion data-structures


【解决方案1】:

我建议将生成的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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复。您能否详细说明 public String nums 方法。我不太明白这种方法背后的原因。此外,上面的代码在打印星号方面做得非常好,但是,它似乎只是从一个星号 ( * ) 到 4 个星号 ( **** ) 打印出来,而不是重复打印出 4 个星号 ( ** ** ) 向后退到一个星号 ( * ) 代替,在打印出 ( **** ) 之后,它开始只打印三个 ( *** )。我试图调整编号和东西,但仍然无法弄清楚我如何才能像上面的帖子一样打印。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多