5

我有这个需要打印星号来绘制三角形的作业。

当drawTriangle(0);

 *

当drawTriangle(1);

  *
 **

当drawTriangle(2);

   *
  **
 * *
****

当 drawTriangle(3);

       *
      **
     * *
    ****
   *   *
  **  **
 * * * *
********

当 drawTriangle(4);

               *
              **
             * *
            ****
           *   *
          **  **
         * * * *
        ********
       *       *
      **      **
     * *     * *
    ****    ****
   *   *   *   *
  **  **  **  **
 * * * * * * * *
****************

当drawTriangle(5);

                               *
                              **
                             * *
                            ****
                           *   *
                          **  **
                         * * * *
                        ********
                       *       *
                      **      **
                     * *     * *
                    ****    ****
                   *   *   *   *
                  **  **  **  **
                 * * * * * * * *
                ****************
               *               *
              **              **
             * *             * *
            ****            ****
           *   *           *   *
          **  **          **  **
         * * * *         * * * *
        ********        ********
       *       *       *       *
      **      **      **      **
     * *     * *     * *     * *
    ****    ****    ****    ****
   *   *   *   *   *   *   *   *
  **  **  **  **  **  **  **  **
 * * * * * * * * * * * * * * * *
********************************

任何建议将被认真考虑。干杯。

4

6 回答 6

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
    }
  }
}

我相信您可以弄清楚如何打印三角形;

于 2010-10-08T11:00:29.783 回答
2

水平 x 的三角形由以下任一方式构建:

  • 如果 x = 0(停止条件),则为一个星号
  • 或者将两个 x-1 级的三角形并排放置,一个在右侧的顶部

棘手的部分涉及打印部分。这里的提示是 x 级三角形的宽度/高度是 2^x...

于 2010-10-08T09:43:30.077 回答
2

你已经注意到三角形的高度是 2^n,我敢肯定。所以你知道你需要打印出那么多行。你也知道你需要记住以前的行,如果你要以某种方式复制它们,所以你知道你需要有一个地方来存储它们——也许是一个向量?

首先,创建向左倾斜而不是向右倾斜的三角形要容易一些。一旦你有事情发生,添加左侧填充使其向右倾斜很容易。

从包含“*”的单行开始:打印并存储该字符串。

然后这样做'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);
  }

奖励积分的最后一个机会:您实际上不需要存储打印出来的行的后半部分。

于 2010-10-08T11:13:33.760 回答
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]

于 2010-10-27T21:17:25.130 回答
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))

这是输出

*
 *
**
   *
  **
 * *
****
       *
      **
     * *
    ****
   *   *
  **  **
 * * * *
********
               *
              **
             * *
            ****
           *   *
          **  **
         * * * *
        ********
       *       *
      **      **
     * *     * *
    ****    ****
   *   *   *   *
  **  **  **  **
 * * * * * * * *
****************
于 2010-10-31T04:51:03.877 回答
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);
    }
}

这几行代码就足以实现这一点。

于 2010-10-28T05:36:48.977 回答