我有这个作业需要打印星号以画三角形。
当drawTriangle(0);
*
当drawTriangle(1);
*
**
当drawTriangle(2);
*
**
* *
****
drawTriangle(3);
*
**
* *
****
* *
** **
* * * *
********
当drawTriangle(4);
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
当drawTriangle(5);
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
******** ********
* * * *
** ** ** **
* * * * * * * *
**** **** **** ****
* * * * * * * *
** ** ** ** ** ** ** **
* * * * * * * * * * * * * * * *
********************************
任何建议将不胜感激。欢呼声。
答案 0 :(得分:3)
具有对象递归的OO设计如下;
public class Triangle
{
int n;
int size;
char[][] data;
public Triangle(int n)
{
this.n = n;
this.size = (int)Math.pow(n,2);
this.data = new char[size][size];
fillInData();
}
void fillInData()
{
if (n == 0)
{
//stop case
data[0][0] = '*';
}
else
{
//create a triangle with n-1
//fill in the top left quadrant of data[][] with spaces
//fill in the other 3 quadrants of data[][] with data[][] from the n-1 triangle
}
}
}
我相信你可以弄清楚如何打印三角形;
答案 1 :(得分:2)
x级别的三角形由以下两者构建:
棘手的部分涉及印刷部分。这里的提示是x级三角形的宽度/高度是2 ^ x ...
答案 2 :(得分:2)
你已经注意到三角形的高度是2 ^ n,我敢肯定。所以你知道你需要打印出那么多行。你也知道你需要记住以前的行,如果你要以某种方式复制它们,那么你知道你需要有一个地方来存储它们 - 也许是一个Vector?
首先,创建倾斜到左侧而不是右侧的三角形更容易一些。一旦你有所作为,就可以很容易地添加左边的填充以使其向右倾斜。
从包含“*”的单行开始:打印它,并存储该字符串。
然后这样做'n'次:
就是这样。只需在打印出的所有内容的左侧添加空格,使其向右倾斜。
(你可能会注意到,一旦你完成了这个,你就可以在它下面的for
循环中完成上面的第一步。当你'使行成为方形'时,你实际上只是想出一个要添加到每一行的空格数。只需在当前行的两个副本之间添加许多空格,在打印输出和存储的新行中,就可以节省打印[并存储]任何不必要的空格。)
以下是一些有用的字符串填充函数。 padRight
会通过在右侧添加空格将字符串延长为n
个字符宽。你猜对了padLeft
,会在左边添加空格:
public static String padRight(String s, int n) {
return String.format("%1$-" + n + "s", s);
}
public static String padLeft(String s, int n) {
return String.format("%1$#" + n + "s", s);
}
奖励积分的最后一次机会:您实际上不需要存储打印出的行的后半部分。
答案 3 :(得分:1)
只为了好玩;这是你在Haskell的问题。可能没有帮助你,但我想分享!
import System
dupl t = zipWith (++) t t
pad n row = (replicate ((2 ^ n) - (length row)) ' ') ++ row
createTriangle 0 = ["*"]
createTriangle n = (map (pad n) prec) ++ (dupl prec)
where prec = createTriangle $ n - 1
drawTriangle = putStr . unlines . createTriangle
main = getArgs >>= drawTriangle . read . (!! 0)
使用runhaskell thisstuff.hs [number]
答案 4 :(得分:1)
这是一个漂亮的python脚本......没有太多pythonic。 :(
def triangle(n):
if n == 0:
return "*"
else:
small = triangle(n-1)
lines = small.split("\n")
top = ""
for line in lines:
top += len(lines[0])*" " + line + "\n"
bot = '\n'.join([2*line for line in lines])
return top + bot
for i in range(5):
print(triangle(i))
这是输出
*
*
**
*
**
* *
****
*
**
* *
****
* *
** **
* * * *
********
*
**
* *
****
* *
** **
* * * *
********
* *
** **
* * * *
**** ****
* * * *
** ** ** **
* * * * * * * *
****************
答案 5 :(得分:0)
import java.util.*;
public class Triangle {
public void drawTriangle(int scale){
scale = 1 << scale;
StringBuilder line = new StringBuilder();
char t = 0;
for (int i = 0; i <= scale; i++){
line.append(" ");
}
line.setCharAt(scale, '*');
for(int i = 0; i < scale; i++){
System.out.println(line);
for(int j = scale-i; j <= scale; j++){
t = line.charAt(j)==line.charAt(j-1) ? ' ':'*';
line.setCharAt(j-1,t);
}
}
}
public static void main(String args[]){
Triangle t = new Triangle();
t.drawTriangle(5);
}
}
这几行代码足以实现这一目标。