Рекурсия треугольника Java

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

****  
 ***
  **
   *

а также

   *
  **
 ***
****

public static String printTriangle(int num)
{
    if (num == 0) {
        return "";
    } 

    String dots = "";
    for (int i = 0; i < num; i++) {
        dots = dots + "*";
    }

    System.out.println(dots);
    return printTriangle(num-1) + dots;
}

  public static String printTriangle2(int num) {
    if (num == 0) {
        return "";
    }

    String dots = printTriangle2(num-1);
    dots = dots + ".";

    String spaces = "";
    for (int i = 0; i < num; i++) {
        spaces = spaces + " ";
    }

    String line = spaces + dots;
    System.out.println(line);
    return line;
}

Это то, что у меня есть до сих пор. Любая помощь будет оценена по достоинству.

Это результат в настоящее время:

****
***
**
*
 .
   ..
      ...
          ....

А что дает ваша попытка? Вы через него отлаживали? Что это показало?

achAmháin 12.10.2018 21:57

этот вопрос отличается от вашего другого вопроса? выглядит так же и там есть ответы stackoverflow.com/questions/52683273/…

tima 12.10.2018 22:14

да, потому что я хочу, чтобы это было проще. другой вывод более сложен и немного труден для понимания

CodingIsHard 12.10.2018 22:19

вы можете передать другой параметр spaces, чтобы отслеживать количество пробелов, которые вам нужно будет распечатать (например, printTriangle (int num, int spaces ))

user3170251 12.10.2018 22:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
452
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

попробуйте следующий код и позвоните с step=0

printTriangle(4,0)
printTriangle2(4,0)

public static String printTriangle(int num, int step)
{
    if (num == 0) {
        return "";
    } 

    String ast = "";
    for (int i = 0; i < num; i++) {
        ast = ast + "*";
    }
    String sps = "";
    for (int i = 0; i < step; i++) {
        sps = sps + " ";
    }


    System.out.println(sps+ast);
    return printTriangle(num-1, step+1) ;
}


    public static String printTriangle2(int num, int step)
{
    if (num == 0) {
        return "";
    } 

    String ast = "";
    for (int i = 0; i <= step; i++) {
        ast = ast + "*";
    }
    String sps = "";
    for (int i = 0; i < num; i++) {
        sps = sps + " ";
    }


    System.out.println(sps+ast);
    return printTriangle2(num-1, step+1) ;
}

Большое спасибо за то, что помог мне решить эту проблему, используя мой код и мою логику. Я действительно понимаю это сейчас!

CodingIsHard 12.10.2018 22:32

Вот довольно простая реализация:

static void printTriangle(int n, int len)
{
  if (n == len) return;

  printRow(n, len);
  printTriangle(n+1, len);
  printRow(n, len);
}

static void printRow(int n, int len)
{
  for(int i=0; i<n; i++) System.out.print(" ");
  for(int i=n; i<len; i++) System.out.print("*");
  System.out.println();
}

Тестовое задание:

printTriangle(0, 4);

Выход:

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

Хотя мне это нравится:

static void printTriangle(String s)
{
  if (!s.contains("*")) return;

  System.out.println(s);
  printTriangle(" " + s.replaceFirst("\\*", ""));
  System.out.println(s);
}

Вызывается с

printTriangle("****");

Другие вопросы по теме