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

时间:2010-10-08 09:24:07

标签: java recursion fractals

我有这个作业需要打印星号以画三角形。

当drawTriangle(0);

 *

当drawTriangle(1);

  *
 **

当drawTriangle(2);

   *
  **
 * *
****

drawTriangle(3);

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

当drawTriangle(4);

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

当drawTriangle(5);

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

任何建议将不胜感激。欢呼声。

6 个答案:

答案 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 = 0,则为一个星号(停止 条件)
  • 或者放置两个 每个旁边的等级x-1的三角形 另一个,一个在右上方 一个

棘手的部分涉及印刷部分。这里的提示是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);
    }
}

这几行代码足以实现这一目标。