【问题标题】:Building a right angled triangle with recursion使用递归构建直角三角形
【发布时间】:2011-04-22 19:13:33
【问题描述】:

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

当drawTriangle(0);

 *

当drawTriangle(1);

  *
 **

当drawTriangle(2);

   *
  **
 * *
****

当drawTriangle(3);

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

当drawTriangle(4);

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

当drawTriangle(5);

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

任何建议将不胜感激。干杯。

【问题讨论】:

  • 您能发布一些适用于drawTriangle(0) 的代码吗?您究竟需要什么帮助?
  • 你可以看到模式,不是吗?在每个级别复制你所拥有的三遍,在左上角留下一个空白。因此,从一个带有单个星的单行缓冲区开始,然后在每个级别将每一行 L 映射到 len(L) 个空格 + L 和 L + L 并组装。但这确实是一个迭代操作 - 我看不到递归的必要性或用途,并且鉴于您在文本中并排构建三角形,我也看不到任何简单的方法来硬塞它。还是这个图形?
  • @Ishtar 我需要执行此操作的逻辑,而不是代码。
  • @Rup 这个 qns 正在递归中,他们要求在递归中完成。无论如何,三角形 5 由许多三角形 4、三角形 3 和三角形 2 组成。但基线仍然是三角形 2
  • 这被称为谢尔宾斯基三角形

标签: java recursion fractals


【解决方案1】:

一个对象递归的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
    }
  }
}

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

【讨论】:

    【解决方案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】:

    x 层的三角形由以下任一者构建:

    • 如果 x = 0(停止 条件)
    • 或者通过放置两个 每个旁边的 x-1 级三角形 另一个,一个在右上方 一个

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

    【讨论】:

    • 我的回答遵循这个模式:)
    【解决方案4】:

    只是为了好玩;这是您在 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]运行

    【讨论】:

      【解决方案5】:

      这是一个漂亮的 Python 脚本……没有太多 Python 风格。 :(

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

      这是输出

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

      【讨论】:

        【解决方案6】:
        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);
            }
        }
        

        这几行代码就足够了。

        【讨论】:

          猜你喜欢
          • 2021-02-12
          • 2022-12-20
          • 1970-01-01
          • 2021-07-18
          • 1970-01-01
          • 2020-07-21
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          相关资源
          最近更新 更多