用递归建立一个直角三角形

Der*_*ong 5 java recursion fractals

我有这个功课需要打印asterick画三角形.

当drawTriangle(0);

 *
Run Code Online (Sandbox Code Playgroud)

当drawTriangle(1);

  *
 **
Run Code Online (Sandbox Code Playgroud)

当drawTriangle(2);

   *
  **
 * *
****
Run Code Online (Sandbox Code Playgroud)

当drawTriangle(3);

       *
      **
     * *
    ****
   *   *
  **  **
 * * * *
********
Run Code Online (Sandbox Code Playgroud)

当drawTriangle(4);

               *
              **
             * *
            ****
           *   *
          **  **
         * * * *
        ********
       *       *
      **      **
     * *     * *
    ****    ****
   *   *   *   *
  **  **  **  **
 * * * * * * * *
****************
Run Code Online (Sandbox Code Playgroud)

当drawTriangle(5);

                               *
                              **
                             * *
                            ****
                           *   *
                          **  **
                         * * * *
                        ********
                       *       *
                      **      **
                     * *     * *
                    ****    ****
                   *   *   *   *
                  **  **  **  **
                 * * * * * * * *
                ****************
               *               *
              **              **
             * *             * *
            ****            ****
           *   *           *   *
          **  **          **  **
         * * * *         * * * *
        ********        ********
       *       *       *       *
      **      **      **      **
     * *     * *     * *     * *
    ****    ****    ****    ****
   *   *   *   *   *   *   *   *
  **  **  **  **  **  **  **  **
 * * * * * * * * * * * * * * * *
********************************
Run Code Online (Sandbox Code Playgroud)

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

sje*_*397 2

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

首先,创建向左倾斜的三角形而不是向右倾斜的三角形要容易一些。一旦你开始做某事,添加左侧填充使其向右倾斜就很容易做到。

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

然后执行“n”次:

  • 使行成为“正方形”,但在其末端添加空格,直到它们的长度相等
  • 对于每个已经存在的行(我的意思是,不包括我们在下面制作的新行):
    • 打印两次
    • 将刚刚打印的内容存储为新行

就是这样。只需在打印出来的所有内容的左侧添加空格即可使其向右倾斜。

(您可能会注意到,完成此操作后,您可以在其下面的循环内执行上面的第一步for。当您“使行成为正方形”时,您实际上只是计算出要添加到每行的空格数.只需在当前行的两个副本之间、打印输出和存储的新行中添加那么多空格,就可以节省打印[和存储]任何不必要的空格。)

这里有一些有用的字符串填充函数。通过在右侧添加空格padRight将字符串延长为字符宽。,你猜对了,会在左边添加空格:npadLeft

  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);
  }
Run Code Online (Sandbox Code Playgroud)

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