Построение прямоугольного треугольника с рекурсией - PullRequest
5 голосов
/ 08 октября 2010

У меня есть домашнее задание, которое необходимо напечатать звездочкой, чтобы нарисовать треугольник.

Когда drawTriangle (0);

 *

Когда drawTriangle (1);

  *
 **

Когда drawTriangle (2);

   *
  **
 * *
****

когда drawTriangle (3);

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

когда drawTriangle (4);

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

когдаdrawTriangle (5);

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

Любой совет будет оценен.Приветствия.

Ответы [ 6 ]

3 голосов
/ 08 октября 2010

ОО-дизайн с рекурсией объекта выглядит следующим образом:

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 голосов
/ 08 октября 2010

Вы заметили, что высота треугольника 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);
  }

Последняя возможность для бонусных баллов: вам на самом деле не нужно хранить последнюю половину строк, которые вы распечатываете.

2 голосов
/ 08 октября 2010

Треугольник уровня x строится либо:

  • Одна звездочка, если x = 0 (условие остановки)
  • Или путем размещения двух треугольников уровня x-1 рядом сдруг с другом, и один сверху правого

Хитрая часть включает в себя печатную часть.Подсказка заключается в том, что ширина / высота треугольника уровня x равна 2 ^ x ...

1 голос
/ 31 октября 2010

Вот красивый сценарий 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))

Вот вывод

*
 *
**
   *
  **
 * *
****
       *
      **
     * *
    ****
   *   *
  **  **
 * * * *
********
               *
              **
             * *
            ****
           *   *
          **  **
         * * * *
        ********
       *       *
      **      **
     * *     * *
    ****    ****
   *   *   *   *
  **  **  **  **
 * * * * * * * *
****************
1 голос
/ 28 октября 2010

просто для удовольствия; Вот твоя проблема в Хаскеле. Может не помочь, но я хочу поделиться!

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]

0 голосов
/ 28 октября 2010
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);
    }
}

Для этого достаточно нескольких строк кода.

...