回答(5)
2 years ago
这是给你的一段代码 . 使用对称填充 .
public class Hourglass {
public static void printRow(int nStars, int padding) {
if (nStars == 0)
return;
if (padding > 0) {
System.out.print(" ");
printRow(nStars, padding - 1);
System.out.print(" ");
return;
}
if (nStars <= 0)
return;
System.out.print("*");
if (nStars > 1) {
System.out.print(" ");
printRow(nStars - 1, padding);
}
}
public static void printTop (int height, int padding) {
if (height == 0)
return;
printRow(height,padding);
System.out.print("\n");
printTop(height - 1, padding + 1);
}
public static void printBottom(int currentHeight, int height, int padding) {
printRow(currentHeight, padding);
System.out.print("\n");
if (currentHeight < height)
printBottom(currentHeight + 1, height, padding - 1);
}
public static void printHourglass(int height) {
if (height <= 0)
throw new IllegalArgumentException();
printTop(height, 0);
printBottom(1, height, height - 1);
}
public static void main(String[] args) {
printHourglass(5);
}
}
2 years ago
而不是循环你的程序,你调用相同的功能 .
public static void hourglass(int numberOfStars, int numberOfSpaces){
hourglass(numberOfStars, numberOfSpaces, false);
}
private static void hourglass(int numberOfStars, int numberOfSpaces, boolean dir){
if(dir==false && numberOfStars > 0){
printMany(numberOfSpaces, " ");
printMany(numberOfStars, "X ");
System.out.println();
hourglass(--numberOfStars, ++numberOfSpaces, false);
return;
}
if(numberOfStars==0){
numberOfSpaces -=2;
numberOfStars += 2;
}
if(numberOfSpaces>0){
printMany(numberOfSpaces, " ");
printMany(numberOfStars, "X ");
System.out.println();
hourglass(++numberOfStars, --numberOfSpaces, true);
}
}
2 years ago
只需将该方法拆分为两个,这是您的问题的另一个递归解决方案:
public static void hourglass(int numberOfStars, int numberOfSpaces) {
if(numberOfStars== 0) return;
printMany(numberOfSpaces++, " ");
printMany(numberOfStars--, "X ");
System.out.println();
hourglass(numberOfStars,numberOfSpaces);
numberOfSpaces -=2;
numberOfStars += 2;
if(numberOfStars==2)
hourglassBottom(numberOfStars,numberOfSpaces);
}
public static void hourglassBottom(int numberOfStars, int numberOfSpaces){
if(numberOfSpaces==0 )return;
printMany(numberOfSpaces--, " ");
printMany(numberOfStars++, "X ");
System.out.println();
hourglassBottom(numberOfStars,numberOfSpaces);
}
例如,运行沙漏(3,1);会给你以下:
X X X
X X
X
X X
X X X
2 years ago
这是一种可能的解决方案:
public static void printMany(int count, String s) {
if (count == 0)
return;
System.out.print(s);
printMany(count - 1, s);
}
public static void upperhalf(int count, int max) {
if (count == 0)
return;
printMany(max - count, " ");
printMany(count, "* ");
System.out.println();
upperhalf(count - 1, max);
}
public static void lowerhalf(int count, int max) {
if (count == max)
return;
printMany(max - count - 1, " ");
printMany(count + 1, "* ");
System.out.println();
lowerhalf(count + 1, max);
}
public static void hourglass(int n) {
upperhalf(n, n);
lowerhalf(0, n);
}
在例如中调用 hourglass(1); main 结果:
*
*
所以 hourglass(2); 打印:
* *
*
*
* *
等等...
2 years ago
我不只是给你答案,但我会尽力帮助你 . 如果你想使用递归和没有循环来解决这个问题,那么关键在于弄清楚递归辅助函数的参数必须是什么 . 看起来你总是需要记住原始用户输入(知道要打印多少空格并知道何时停止递归),你当前的星数,以及你是否在顶部金字塔的一半或下半部分 . 鉴于所有这些信息,您应该能够做两件事 . 首先,您应该能够正确地打印出一条线 . 其次,您应该能够确定下一行应该是什么 . 鉴于此,您可以打印并递归,一旦达到基本案例就停止 .