如何以正确的方式打印圆点图案?

时间:2014-07-07 18:24:42

标签: java

这就是我所拥有的。

当我在makePattern(int size)中省略了一个makePattern(size - 1)时,我得到了下半部分。但我不知道如何获得上半部分。

public void makePattern(int size){

    stringList = new ArrayList<String>();
    if (size == 0){
        System.out.print("");
    }
    else{

        makePattern(size - 1);
        System.out.println(dotString(size));
        makePattern(size - 1);

    }
}

辅助方法

  public String dotString(int x){
    if (x == 1){
        return ".";
    }
    else{

        return dotString(x - 1) + ".";
    }
}

测试的主要方法:

   public static void main(String[] args) {

    Pattern rP = new Pattern();

    int sizePt = 5;
    System.out.println();
    for(int i=1; i<=sizePt; i++) {
        System.out.println("pattern " + i);
        rP.makePattern(i);
        ArrayList<String> pattern = rP.getStringList();
        for(int j = 0; j < pattern.size() ; j++)
            System.out.println(pattern.get(j));

        System.out.println();
    }

我得到的输出:

模式1

.

模式2

.

..

.

模式3

.

..

.

...

.

..

.

我想要的输出是:

即。 makePattern(3)

.

..

...

..

.

2 个答案:

答案 0 :(得分:2)

每次进行递归通话时,您每次都会制作完整的模式。这不是你想要的。相反,您希望在每个函数调用时使模式的一半。上半部分或下半部分。


所以最后你想要一个递归函数来做到这一点:

.  
..  
...  

以及执行此操作的递归函数(可以使用相同的函数执行这两项操作)

...
..
.

和将它们联系在一起的功能。


您可以采取的另一种方法是每个函数只有一个递归调用。

创建一个在此模式上打印变体的函数

...
....
.....
....
...

然后像这样调用它

makePattern(**insert args here**)
{
    //handle base case
    System.out.println(dotString(size));
    makePattern(**insert args here**)
    System.out.println(dotString(size));
}

答案 1 :(得分:0)

我的2美分:

public void makePattern(int size, int direction)
{
    if (size == 0)
        return; // quit recursion when we're down to 0

    // start out recursively calling back until we reach 0 with -1 direction
    // that will print AFTER the calls to the negative direction so the last
    // recursive call prints FIRST
    if (direction <= 0)
        makePattern(size - 1, -1);

    // all the makePatterns and prints for the lower direction will happen
    // and return back to here where we call print for the original number
    // passed
    System.out.println(dotString(size));

    // now we recursively call with direction = 1 AFTER printing so the last
    // recursive call prints LAST
    if (direction >= 0)
        makePattern(size - 1, 1);
}