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 の場合はアスタリスク 1 つ (停止条件)
  • または、レベル x-1 の 2 つの三角形を隣り合わせに配置し、1 つを右側の三角形の上に配置します。

トリッキーな部分には、印刷部分が含まれます。ここでのヒントは、レベル x の三角形の幅/高さが 2^x であることです...

于 2010-10-08T09:43:30.077 に答える
2

三角形の高さが 2^n であることにお気づきでしょうか。したがって、それだけの数の行を印刷する必要があることがわかります。また、何らかの方法で前の行をコピーする場合は、前の行を覚えておく必要があることも知っているので、それらを保存する場所が必要であることもわかっています。おそらくベクトルですか?

まず、右ではなく左に傾いた三角形を作成する方が少し簡単です。左パディングを追加して右に傾かせるのは、何かがうまくいったら簡単です。

"*" を含む単一の行から始めます: それを印刷し、その文字列を保存します。

次に、これを「n」回実行します。

  • すでに「正方形」になっている行を作成しますが、それらがすべて同じ長さになるまでスペースを最後に追加します
  • 既存の行ごとに (つまり、以下で作成している新しい行は含まれません):
    • 2回印刷して
    • 印刷したものを新しい行として保存します

それでおしまい。印刷するすべてのものの左側にスペースを追加して、右側に傾けてください.

(一度これを行うと、そのfor下のループ内で上記の最初のステップを実行できることに気付くかもしれません。「行を正方形にする」とは、実際には、各行に追加するスペースの数を把握しているだけです。 . 現在の行の 2 つのコピーの間に、印刷出力と保存する新しい行にそれだけ多くのスペースを追加するだけで、不要なスペースを印刷 [および保存] する必要がなくなります。)

役立つ文字列パディング関数をいくつか紹介します。右側にスペースを追加することにより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);
  }

ボーナス ポイントの最後の機会: 実際には、印刷した行の後半を保存する必要はありません。

于 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 に答える