您输入n
,表示钻石所拥有的行数的一半。我能够制作钻石的前半部分,但我对下半场非常沮丧。我似乎无法得到它。我不是在这里要求我需要的具体代码,但是你能指出我正确的方向并给我一些如何写这个的提示/技巧吗?另外,如果我以错误的方式处理这个程序,请随时告诉我并告诉我应该如何处理该程序。
底部的钻石代表输入5 。 n-1 表示每个星号左侧的空格。谢谢你的帮助!
public static void printDiamond(int n)
{
for(int i=0;i<n;i++)
{
for(int a=0;a<(n-(i+1));a++)
{
System.out.print(" ");
}
System.out.print("*");
for(int b=0; b<(i*2);b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
}
** What I need ** What I have currently
*--* *--*
*----* *----*
*------* *------*
*--------* *--------*
*--------*
*------*
*----*
*--*
**
答案 0 :(得分:2)
public static void main(String[] args) {
int n = 10;
for (int i = 1 ; i < n ; i += 2) {
for (int j = 0 ; j < n - 1 - i / 2 ; j++)
System.out.print(" ");
for (int j = 0 ; j < i ; j++)
System.out.print("*");
System.out.print("\n");
}
for (int i = 7 ; i > 0 ; i -= 2) {
for (int j = 0 ; j < 9 - i / 2 ; j++)
System.out.print(" ");
for (int j = 0 ; j < i ; j++)
System.out.print("*");
System.out.print("\n");
}
}
<强>输出强>
*
***
*****
*******
*********
*******
*****
***
*
答案 1 :(得分:1)
只需扭转你的循环:
for(int i=n-1;i>=0;i--)
{
for(int a=0;a<(n-(i+1));a++)
{
System.out.print(" ");
}
System.out.print("*");
for(int b=0; b<(i*2);b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
答案 2 :(得分:1)
由于你已经形成了一半的钻石,只需再次反复运行循环,例如:
public static void printDiamond(int n)
{
for (int i = 0; i < n; i++)
{
for (int a = 0; a < (n - (i + 1)); a++)
{
System.out.print(" ");
}
System.out.print("*");
for (int b = 0; b < (i * 2); b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
for (int i = n-1; i >= 0; i--)
{
for (int a = 0; a < (n - (i + 1)); a++)
{
System.out.print(" ");
}
System.out.print("*");
for (int b = 0; b < (i * 2); b++)
{
System.out.print("-");
}
System.out.print("*");
System.out.println();
}
}
答案 3 :(得分:1)
每当我看到一种对称性时,递归就会响起我的脑袋。我只是为你和其他有趣的人发布了更多的知识。开始时,递归可能更难掌握,但由于您已经有了基于循环的解决方案,因此与递归形成对比将清楚地概述优点和缺点。我的建议,不要错过进入它的机会:)
递归解决方案:
static int iteration = 0;
public static void printDiamond(int n) {
int numberOfBlanks = n - iteration;
int numberOfDashes = iteration * 2;
String blank = new String(new char[numberOfBlanks]).replace("\0", " ");
String dash = new String(new char[numberOfDashes]).replace("\0", "-");
String star = "*";
String row = blank + star + dash + star + blank;
// printing the rows forward
System.out.println(row);
iteration++;
if (iteration < n) {
printDiamond(n);
}
// printing the rows backward
System.out.println(row);
}
首先,不要与奇怪的新字符串(新字符串[numberOfBlanks])混淆。替换(“\ 0”,“”); 它是java中的一个巧妙的技巧来构造一个带有重复字符的字符串,例如 new String(new char [5])。replace(“\ 0”,“+”); 将创建以下字符串+++++
递归位解释。在递归停止之前,第二个println将不会运行。停止标准由迭代&lt; Ñ。在此之前,将打印直到该点的行。所以像这样:
iteration 1. row = **
iteration 2. row = *--*
iteration 3. row = *----*
iteration 4. row = *------*
iteration 5. row = *--------*
比递归停止,其余代码执行但顺序相反。因此只打印第二个println,行变量的值如下所示
continuing after 5 iteration row = *--------*
continuing after 4 iteration row = *------*
continuing after 3 iteration row = *----*
continuing after 2 iteration row = *--*
continuing after 1 iteration row = **
我没有进入它背后的机制,有足够的资源,这只是为了让你产生好奇心。希望它有所帮助,最好