这就是我所拥有的。
当我在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)
.
..
...
..
.
答案 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);
}